我正在编写类作为二进制文件,tcp包等的二进制结构的“更高级”表示。
为此,为了便于阅读,如果我可以定义一些自定义属性来确定关于每个类字段的一些信息(例如二进制缓冲区中该字段的偏移量,大小等),那将是非常好的。领域等)。
我可以通过声明常量整数来实现这一点,但恕我直言,代码将非常丑陋和肮脏。所以我想到了使用属性,这是一种非常优雅的方式来实现我想要的。像InteropServices.Marshal这样的功能实际上使用属性(作为StructLayout,MarshalAs和FieldOffset)来完成与我想要的非常相似的东西,所以我只能假设与可读性的增益相比,性能权衡是有利的(如果我',请纠正我。我错了。)
那么,编译器/ CLR如何处理前面提到的InteropServices属性?
你们认为前面提到的权衡是否值得?如果是,处理属性的最佳方法是使用Refletion的默认方法?我假设可能有其他方法来访问属性而不是Reflection,因为我知道这有点贵,Marshal几乎在每种方法中都使用它。
非常感谢任何有用的想法,谢谢。
答案 0 :(得分:1)
你提出的建议听起来是合理的,假设与Interop的相似之处与你所描述的一样清晰。为了避免为每个属性访问使用反射的性能问题,您可以使用反射一次,可能通过静态构造函数,并为每个属性构建已编译的表达式。性能应该相当于调用我想的虚拟方法。
以下是指向不同动态调用类型之间性能差异的博客文章的链接。编译后的表达式比缓存的反射快10倍,“仅”比编译的属性访问慢2倍。