Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 何时创建属性对象?_C#_Attributes - Fatal编程技术网

C# 何时创建属性对象?

C# 何时创建属性对象?,c#,attributes,C#,Attributes,由于属性实际上只是附加到程序集的元数据,这是否意味着属性对象仅在请求时创建(例如在调用GetCustomAttributes时) 或者它们是在创建对象时创建的 或者,前两个的组合,当对象由于CLR通过C从CLR扫描属性而创建时,第三版: 如果要构造属性对象,必须调用GetCustomAttributes或 GetCustomAttribute。每次调用其中一个方法时,它都会构造新实例 并基于源代码中指定的值设置实例的每个字段和属性。这些方法返回对所应用属性类的完全构造实例的引用 因此,是的,它们

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

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

或者,前两个的组合,当对象由于CLR通过C从CLR扫描属性而创建时,第三版:

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


因此,是的,它们只是根据请求创建的。

它们是根据请求创建的


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

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


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

非常相关:。甚至可能会回答你的问题,考虑一下。它确实在某种程度上回答了你的问题。实际问题对我来说并不是一个问题,但中间出现了答案。有CLR手册中的经文也很好(通过@Smi)。那么,属于系统的属性(“DllImport”)会作为元数据保留并以这种方式解析,而不是创建并使用对象吗?工具对属性的实际操作到处都是。