静态构造函数在实例构造函数之后调用?

亲爱的,这个问题已经被问过了 ,但是答案中没有解释我看到的问题。

问题: C#编程指南说:

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

特别是,在创建任何类的实例之前调用静态构造函数。 (这不能确保静态构造函数在创建实例之前完成,但这是另一回事。)

我们来看一下示例代码:

using System; public class Test { static public Test test = new Test(); static Test() { Console.WriteLine("static Test()"); } public Test() { Console.WriteLine("new Test()"); } } public class Program { public static void Main() { Console.WriteLine("Main() started"); Console.WriteLine("Test.test = " + Test.test); Console.WriteLine("Main() finished"); } } 

它输出:

Main()开始了
新测试()
静态测试()
Test.test =测试
Main()完成了

因此,我们可以看到实例构造函数在静态构造函数启动 之前完成(因此创建了一个实例)。 这不符合指南吗? 也许静态字段的初始化被认为是静态构造函数的隐式部分?

static字段的内联初始值设定项在显式static构造函数之前运行。

编译器将您的类转换为以下内容:

 public class Test { .cctor { //Class constructor Test.test = new Test(); //Inline field initializer Console.WriteLine("static Test()"); //Explicit static ctor } .ctor { ... } //Instance constructor } 

请注意,这与声明顺序无关。

引用规范 :

类的静态字段变量初始值设定项对应于以它们出现在类声明中的文本顺序执行的赋值序列。 如果类中存在静态构造函数(第10.11节) ,则在执行该静态构造函数之前立即执行静态字段初始值设定项。