何时创建属性对象?

时间:2012-02-06 20:44:20

标签: c# attributes

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

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

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

3 个答案:

答案 0 :(得分:8)

从CLR到C#,第三版:

  

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

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

答案 1 :(得分:4)

它们是根据要求创建的。

例如,如果向.NET 2.0程序集添加一些.NET 3.0属性(例如WCF DataContractAttribute),您仍然可以在不具备.NET 2.0程序集的计算机上使用.NET 2.0程序集。已安装.NET 3.0,前提是您没有任何尝试访问属性的代码。

答案 2 :(得分:2)

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

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