由于属性实际上只是附加到程序集的元数据,这是否意味着属性对象仅在请求时创建(例如当您调用GetCustomAttributes时)?
或者他们是在创建对象时创建的?
或者,由CLR的属性扫描创建对象时创建的前2个的组合?
答案 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()。这种代码永远不会与对象的实例相关联,属性适用于类型。