什么时候是在C#中调用的静态构造函数?

Jas*_*son 82 c# static

当我有包含静态构造函数的类时,是否在首次加载包含该类的程序集时或在第一次引用该类时调用该构造函数?

小智 87

第一次访问类时.

静态构造函数(C#编程指南)

静态构造函数用于初始化任何静态数据,或执行仅需执行一次的特定操作.在创建第一个实例或引用任何静态成员之前自动调用它.

  • 有趣的是它说"在创建第一个实例之前或引用任何静态成员".当*实际被调用时,*中存在一些余地. (6认同)
  • @TimBarrass由于其他一些规范要求,事实证明"之前"实际上是"紧接着" - 请参阅其他答案中引用的Jon Skeet的文章 - http://stackoverflow.com/a/1437372/477420 (6认同)

Gre*_*ech 38

尽管文档简单明了,但并不像你想象的那么简单.Jon Skeet的文章http://csharpindepth.com/Articles/General/Beforefieldinit.aspx详细介绍了这个问题.

摘要:

静态构造函数保证在第一次引用该类成员之前立即执行- 创建实例或自己的类的静态方法/属性.

请注意,静态初始化程序(如果没有静态构造函数)保证在首次引用特定字段之前的任何时间执行.


Guf*_*ffa 19

在您使用类中的任何内容之前调用静态构造函数,但确切地说,何时发生这种情况取决于实现.

保证在访问第一个静态成员之前和创建第一个实例之前调用它.如果从未使用过类,则根本不保证调用静态构造函数.

  • 当它发生时*不是*"直到实现"如果该实现遵循ECMA C#规范:"静态构造函数的执行是由应用程序域中发生的以下第一个事件触发的:[1]实例创建了类.[2]引用了类的任何静态成员." (第17.11节,http://www.ecma-international.org/publications/standards/Ecma-334.htm) (2认同)
  • @Guffa:这可能是文章作者的解释,但你不会在微软或ECMA/ISO版本的C#规范中找到这样的措辞. (2认同)