【问题标题】:Define attributes as compile-time data?将属性定义为编译时数据?
【发布时间】:2016-05-01 23:05:00
【问题描述】:

我正在编写类以作为二进制文件、tcp 数据包等的某些二进制结构的“更高级别”表示。

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

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

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

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

非常感谢任何有用的想法,谢谢。

【问题讨论】:

    标签: c# attributes interop low-level


    【解决方案1】:

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

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

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

    【讨论】:

    • 您好迈克,感谢您的回答。你知道这是否是元帅的方法处理属性的方式吗?我有点好奇呵呵。
    • 不。结构和布局属性是特殊的,clr 知道它们意味着以特定方式布局内存。对于所有血腥细节,这是一个很好的参考:simple-talk.com/dotnet/.net-framework/…
    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2013-05-26
    • 2019-02-01
    • 2021-03-15
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多