当我有一个包含静态构造函数的类时,是在第一次加载包含该类的程序集时或在该类的第一个引用被单击时调用该构造函数吗?
Answers:
A static constructor is used to initialize any static data
没有。最好用于static initializer
初始化静态内容。
尽管文档简单明了,但它并不像您期望的那么简单。乔恩·斯基特(Jon Skeet)的文章http://csharpindepth.com/Articles/General/Beforefieldinit.aspx详细介绍了此问题。
概要:
保证静态构造函数将在首次引用该类的成员之前立即执行-创建实例或类的静态方法/属性。
注意,静态初始化程序(如果没有静态构造函数)保证在首次引用特定字段之前的任何时间执行。
在类中使用任何东西之前,将调用静态构造函数,但是确切的时间取决于实现。
确保在访问第一个静态成员之前和创建第一个实例之前调用它。如果从不使用该类,则根本不能保证静态构造函数被调用。
似乎有一个静态构造函数的陷阱,可以在其他地方回答,但花了一些时间才能消化成简单的解释。所有文档和说明都声称静态构造函数/初始化器在实例化第一个类或引用第一个静态字段之前已“保证”运行。当您尝试将静态单例放在创建自身实例(鸡/蛋)的类中时,就会出现问题。在这种情况下,静态构造函数最终在实例构造函数之后被调用-在我的情况下,实例构造函数包含依赖于某些静态数据的代码。
静态构造函数可以在非静态构造函数之后运行。这是编译器错误吗?
(对我来说,答案是将单例放在单独的类中,或者在需要之前在实例构造函数中手动初始化静态数据)