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

Define attributes as compile-time data?

我正在写 classes 来 "higher-level" 表示某些二进制结构,如二进制文件、tcp 数据包等

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

我可以通过声明常量整数来完成此操作,但恕我直言,代码会非常丑陋和混乱。所以我想到了使用属性,这是一种非常优雅的方式来完成我想要的。 InteropServices.Marshal 等功能实际上使用属性(如 StructLayout、MarshalAs 和 FieldOffset)来完成与我想要的非常相似的事情,因此我只能假设与可读性的增益相比,性能权衡是有利的(请纠正我,如果我错了)。

那么,compiler/CLR如何处理上述InteropServices的属性?

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

任何有用的想法将不胜感激,谢谢。

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

这里有一个 link 到一个博客 post 表示不同动态调用类型之间的性能差异。编译表达式比缓存反射快 10 倍,"only" 比编译 属性 访问慢 2 倍。

http://www.palmmedia.de/Blog/2012/2/4/reflection-vs-compiled-expressions-vs-delegates-performance-comparision