2012-02-06 114 views
12

由于属性实际上只是元数据附加到程序集,这是否意味着属性对象只能根据请求创建(例如,当您调用GetCustomAttributes时)?何时创建属性对象?

或者它们是在创建对象时创建的吗?

或者,由于CLR的属性扫描而创建对象时创建的前2个的组合?

+0

相关相关:[.NET属性:为什么GetCustomAttributes()每次都创建一个新的属性实例?](http://stackoverflow.com/q/417275/319403)。考虑到甚至可能回答你的问题。 – cHao 2012-02-06 20:57:01

+0

它在某种程度上做到了。真正的问题对我来说并不是真正的问题,但中间是答案。 CLR书籍中的经文也很好(通过@Smi)。 – Dann 2012-02-07 10:20:50

回答

8

从CLR通过C#,第三版:

如果你想构建一个属性对象,必须调用要么GetCustomAttributesGetCustomAttribute。每次调用其中一个方法时,它会构造指定属性类型的新实例 ,并根据源代码中指定的值设置实例的每个字段和属性。这些方法返回对应用属性类的完全构造实例的引用。

所以,他们只是根据要求创建的。

4

它们根据要求创建。例如,如果将某些.NET 3.0属性添加到.NET 2.0程序集(例如WCF DataContractAttribute)中,则仍然可以在不具有.NET的计算机上使用.NET 2.0程序集。 3.0已安装,前提是您没有任何试图访问属性的代码。

2

它不是那么干净,属性也影响代码生成。例如,某些属性由编译器解释,例如[DllImport]。例如,有些被抖动发现,[MethodImpl]。这是无限地扩展到框架中的其他工具和类,这些工具和类是为了利用属性而编写的。

但是,如果你想找到自己的属性,这些工具只是在做你需要做的事情,调用GetCustomAttributes()是必需的。这种代码从不与对象的实例关联,属性适用于类型。

+0

因此,那些属于系统的属性(“DllImport”)会保留为元数据并且以这种方式进行解析,而不是创建并随后使用对象? – Dann 2012-02-07 10:14:41

+1

工具实际*做的*与属性是遍布各地。 – 2012-02-07 10:36:11