当我有包含一个静态构造函数的类时,该构造函数在包含该类的程序集第一次加载时或当该类的第一个引用被命中时调用?什么时候是在C#中调用的静态构造函数?
回答
第一次访问该类时。
Static Constructors (C# Programming Guide)
静态构造用于初始化任何静态数据,或者执行需要仅一次执行的特定动作。它在创建第一个实例或引用任何静态成员之前自动调用。
尽管直截了当的文档,它并不像你所期望的那么简单。 Jon Skeet的文章http://csharpindepth.com/Articles/General/Beforefieldinit.aspx详细讨论了这个问题。
总结:
静态构造是保证将第一参考该类别的成员之前立即执行- 无论是创建实例或类的自己的静态方法/属性的。
请注意,在第一次参考特定字段之前,保证在任何时间执行静态初始化器(如果没有静态构造函数)。
+1。打倒我,但只是。 ;) – AnthonyWJones 2009-09-17 08:04:47
这是非常有趣的阅读,谢谢男士们。 – Jason 2009-09-17 08:10:48
提到的文章现在在Jon Skeet的网站上:http://csharpindepth.com/Articles/General/Beforefieldinit.aspx – dotnetguy 2014-07-23 09:10:27
在您使用类中的任何内容之前调用静态构造函数,但是在发生这种情况时的确切时间取决于实现。
保证在第一个静态成员被访问之前和第一个实例被创建之前被调用。如果这个类从未被使用过,那么静态构造函数就不能保证被调用。
发生时*如果该实现遵循ECMA C#规范,则*不是“实现”:“静态构造函数的执行是由在应用程序域内发生下列第一个事件触发的:[1]该类的实例被创建。[2]引用该类的任何静态成员。“ (第17.11节,http://www.ecma-international.org/publications/standards/Ecma-334.htm) – LukeH 2009-09-17 09:16:10
@Luke:“静态构造函数执行的确切时间是依赖于实现的”http://ondotnet.com /酒吧/ A/DOTNET/2003/07/07/staticxtor。html – Guffa 2009-09-17 10:12:44
@Guffa:这可能是文章作者的解释,但是你不会在Microsoft或ECMA/ISO版本的C#规范中找到这种措辞。 – LukeH 2009-09-17 10:37:04
如果从父类调用静态方法,则不会调用静态构造函数,而是明确指定它。这里是一个例子,如果b.methoda()被调用,b构造函数不会被调用。
static void Main(string[] args)
{
b.methoda();
}
class a
{
public static void methoda()
{
//using initialized method data
}
}
class b : a
{
static b()
{
//some initialization
}
}
- 1. C#中外部静态构造函数的用途是什么?
- 2. 什么时候注入构造函数,什么时候是CDI
- 3. 基础构造函数调用的静态是什么?
- 4. C++什么时候运行静态分配的对象的构造函数
- 5. C#中的静态构造函数究竟是什么?
- 6. 什么时候在嵌套类中调用构造函数(Java)
- 7. 什么时候在cpp中调用拷贝构造函数?
- 8. 什么是复制构造函数,什么时候应该在C#中使用?
- 9. 总是调用静态构造函数
- 10. 什么时候在C++中使用'new'运算符调用构造函数?
- 11. 什么时候调用SignalR中心构造函数?
- 12. 为什么在静态转换之后调用构造函数?
- 13. 什么时候在C++中生成默认构造函数
- 14. 什么时候在C++中调用析构函数?
- 15. C中的静态构造函数
- 16. 什么时候需要从构造函数调用`super`?
- 17. Objective C静态构造函数与动态构造函数
- 18. 静态构造函数的用途是什么?
- 19. 显式调用静态构造函数
- 20. 非静态类中静态构造函数的功能是什么?
- 21. 调用父类和子类的静态构造函数的顺序是什么?
- 22. 静态构造函数的行为(C#)
- 23. 为什么在包含类的构造函数之前调用静态成员的构造函数?
- 24. C#实例构造函数与静态构造函数
- 25. 什么时候使用构造函数,何时使用OnInit
- 26. Java - 构造函数是静态的吗?
- 27. 零参数构造函数有什么好处?什么时候是理想的?
- 28. 未被调用的C++模板静态成员构造函数
- 29. 模仿C++静态构造函数
- 30. C++静态库和构造函数
谢谢,这是有道理的,当我正确思考它! – Jason 2009-09-17 08:10:03
有趣的是,它表示“在创建第一个实例或引用任何静态成员之前”。当它实际被调用时,在*有一些余地。 – 2011-05-13 10:20:25
@TimBarrass由于规范的某些其他要求,“之前”实际上是“之前” - 请参阅Jon Skeet的文章在其他答案中引用 - http://stackoverflow.com/a/1437372/477420 – 2015-09-12 05:01:07