我从网上阅读有关C#属性和元数据的教程。这很酷,但我想知道它的含义。
加载程序集时是否加载了(自定义)属性?或者仅当您使用反射来检索元数据时?
似乎属性增加了代码大小的总和,因为它被编译成可执行文件?这是对的吗?
是否可以拥有编译时属性?即只有在定义了DEBUG时才会应用属性?
我知道要这样做:
#if DEBUG
[MyCustomAttribute]
#endif
但我想知道是否有更好的方法?
谢谢!
-Stephanus
答案 0 :(得分:6)
属性有两部分,它们的代码及其构造函数参数和属性数据。代码存储在程序集的IL中,数据存储在程序集元数据中。如果未使用某个属性,则只占用一些虚拟内存空间,但不需要任何计算机资源。
在使用GetCustomAttributes()方法之前没有任何反应。然后,属性类的代码即时编译,就像程序集中的常规代码一样。使用元数据中的属性数据调用构造函数和属性setter。当内存管理器映射IL,机器代码和元数据页时,你会用掉两个RAM。
答案 1 :(得分:4)
1)AFAIK属性是惰性实例化的,但它们随附于内存中 2)没有足够的担心。 Knuth等 3)是的。
使用属性意味着使用反射,它可以在框架中执行的一些最慢的事情中进行排序。但那么,你的申请是否太慢?在不知道你在做什么的情况下,更不用说你需要在多少毫秒内做什么,没有人可以给你一个是或否答案。
最好的事情是制作一个原型并看看它是什么样的IRL。再一次,Knuth等。
答案 2 :(得分:3)