当我有一个包含静态构造函数的类时,是否在首次加载包含该类的程序集时或在第一次引用该类时调用该构造函数?
答案 0 :(得分:84)
第一次访问课程时。
Static Constructors (C# Programming Guide)
静态构造函数用于初始化任何静态数据,或执行仅需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前会自动调用它。
答案 1 :(得分:35)
尽管文档简单明了,但并不像你想象的那么简单。 Jon Skeet的文章http://csharpindepth.com/Articles/General/Beforefieldinit.aspx详细讨论了这个问题。
要点:
保证静态构造函数在第一次引用该类的成员之前立即执行 < - 创建实例或者自己的类的静态方法/属性。
请注意,静态初始化器(如果没有静态构造函数)保证在第一次引用特定字段之前随时执行。
答案 2 :(得分:19)
在您使用类中的任何内容之前调用静态构造函数,但确切地说,何时发生这种情况取决于实现。
保证在访问第一个静态成员之前和创建第一个实例之前调用它。如果从未使用过类,则根本不保证静态构造函数被调用。
答案 3 :(得分:1)
如果从父类调用静态方法,则不会调用静态构造函数,而是显式指定静态构造函数。这是一个例子,如果调用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
}
}
答案 4 :(得分:0)
似乎有一个静态构造函数的陷阱,可以在其他地方回答,但花了一些时间才能消化成简单的解释。所有文档和说明都声称静态构造函数/初始化器在实例化第一个类或引用第一个静态字段之前已“保证”运行。当您尝试在创建自身实例(鸡/蛋)的类中放置静态单例时,就会出现陷阱。在这种情况下,静态构造函数最终在实例构造函数之后被调用-在我的情况下,实例构造函数包含依赖于某些静态数据的代码。
Static constructor called after instance constructor?
Static constructor can run after the non-static constructor. Is this a compiler bug?
(对我来说,答案是将单例放在单独的类中,或者在需要之前在实例构造函数中手动初始化静态数据)