Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将属性定义为编译时数据?_C#_Attributes_Interop_Low Level - Fatal编程技术网

C# 将属性定义为编译时数据?

C# 将属性定义为编译时数据?,c#,attributes,interop,low-level,C#,Attributes,Interop,Low Level,我编写的类是一些二进制结构的“高级”表示,如二进制文件、tcp数据包等 为此,为了可读性,如果我可以定义一些自定义属性来确定关于每个类字段的一些信息(例如,该字段在二进制缓冲区中的偏移量、字段大小等),那将非常好 我可以通过声明常量整数来实现这一点,但是我觉得代码非常难看和肮脏。所以我考虑使用属性,这是一种非常优雅的方式来实现我想要的。InteropServices.Marshal等功能实际上使用属性(如StructLayout、MarshalAs和FieldOffset)来完成与我想要的非常相

我编写的类是一些二进制结构的“高级”表示,如二进制文件、tcp数据包等

为此,为了可读性,如果我可以定义一些自定义属性来确定关于每个类字段的一些信息(例如,该字段在二进制缓冲区中的偏移量、字段大小等),那将非常好

我可以通过声明常量整数来实现这一点,但是我觉得代码非常难看和肮脏。所以我考虑使用属性,这是一种非常优雅的方式来实现我想要的。InteropServices.Marshal等功能实际上使用属性(如StructLayout、MarshalAs和FieldOffset)来完成与我想要的非常相似的任务,因此我只能假设性能折衷比可读性的提高更有利(如果我错了,请纠正我)

那么,编译器/CLR如何处理前面提到的InteropServices属性呢

你们认为前面提到的权衡值得吗?如果是,处理属性的最佳方法是使用Refletion的默认方法?我假设可以有其他方法来访问属性而不是反射,因为我知道这有点昂贵,Marshal几乎在所有方法中都使用它


如果您有任何有用的想法,我们将不胜感激,谢谢。

假设与Interop的相似之处如您所描述的那样清楚,那么您的建议听起来是合理的。为了避免对每个属性访问使用反射的性能问题,您可以使用反射一次,可能是通过静态构造函数,然后为每个属性构建编译表达式。我认为,性能应该相当于调用虚拟方法

这里有一个链接,指向一篇博客文章,指出不同动态调用类型之间的性能差异。编译的表达式比缓存的反射快约10倍,比编译的属性访问慢“仅”2倍


你好,迈克,谢谢你的回答。您知道封送员的方法处理属性的方式是否是这样的吗?我有点好奇,呵呵,不。结构和布局属性是特殊的,clr知道它们意味着以特定的方式布局内存。对于所有血淋淋的细节,这是一个很好的参考: