Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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#_.net_Attributes - Fatal编程技术网

C# 属性构造函数在运行时的什么时候运行?

C# 属性构造函数在运行时的什么时候运行?,c#,.net,attributes,C#,.net,Attributes,试图找到一些关于复杂属性的详细参考资料。任何帮助都将不胜感激 在这一点上,我特别想知道在运行时属性构造函数在什么时候运行 如果超过一节课 如果是在一处地产上 如果是因为一种方法 谢谢。您唯一可以确定的是,它会在需要之前被调用。没有定义调用构造函数的确切时间 无论如何,该行为是未指定的,因此您不应该依赖于当前实现何时调用构造函数。当您调用类型或MemberInfo上的GetCustomAttributes()时,将调用构造函数。读取规范(C#2.0版本中的17.3.2)未指定。只有将metat

试图找到一些关于复杂属性的详细参考资料。任何帮助都将不胜感激

在这一点上,我特别想知道在运行时属性构造函数在什么时候运行

  • 如果超过一节课
  • 如果是在一处地产上
  • 如果是因为一种方法

谢谢。

您唯一可以确定的是,它会在需要之前被调用。没有定义调用构造函数的确切时间


无论如何,该行为是未指定的,因此您不应该依赖于当前实现何时调用构造函数。

当您调用类型或MemberInfo上的GetCustomAttributes()时,将调用构造函数。

读取规范(C#2.0版本中的17.3.2)未指定。只有将metatada转换为实例的方法是


因此,您可能需要在不同的实现上进行测试,因为如果未指定它,则必然会有不同的解释。

属性是存储元数据或类型信息的装饰。 .Net framework在创建实例时大量利用此类信息进行额外处理

该属性仅在其他类请求时构造,例如Type.GetCustomAttributes()。因此,即使您可以创建自己的属性,然后请求自定义属性

public class MyOwnAttribute: Attribute {}
/*在另一个班级的某个时候*/

void CheckIfClassIsDecoratedWithMyOwnAttribute()
{
    var instance = new MyClass();
    if (instance.GetType().GetCustomAttributes(typeof(MyOwnAttribute)))
    {
       //do whatever you want
    }
}

有点像静态构造函数?不,这个构造函数实际上是指定的。。。。在给定的应用程序域中最多执行一次。静态构造函数的执行由应用程序域中发生的以下事件中的第一个触发:创建类的实例。类的任何静态成员都被引用。@VirtualBlackBox a twofor!这说明了这一点+1@Sunny通过调试器运行它并亲自查看。这很有意义。澄清一下:如果我在一个类上有一个属性在另一个类请求GetCustomAttributes时被“构造”,并且该属性在其构造函数中是其属性的GetCustomAttributes,那么它应该可以正常工作。@Rex我可以自己通过调试器运行它,但我认为堆栈溢出会更快,它是:-P@divitiae当然你问了,有人已经回答了你。但是@Sunny似乎不相信我的话:)@Rex-M:debug mode/code!=释放,所以调试器中显示的某些行为不是证据。我同意,您很可能是对的,但是如果规范中没有明确说明,它可能随时发生变化,并且在“无文档”特性上构建程序是一个坏主意。