亲爱的,像这样的问题一直是already asked,但在答案中没有解释我所看到的问题。
问题:C# Programming Guide说:
静态构造函数用于初始化任何静态数据,或执行仅需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前会自动调用它。
特别是,在创建任何类的实例之前调用静态构造函数。 (这不能确保静态构造函数在创建实例之前完成,但这是一个不同的故事。)
让我们考虑一下示例代码:
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()完成了
因此,在静态构造函数启动之前,我们可以看到实例构造函数完成(因此创建了一个实例)。这不符合指南吗?也许静态字段的初始化被认为是静态构造函数的隐式部分?
答案 0 :(得分:26)
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
}
请注意,这与声明顺序无关。
引用spec:
静态字段变量初始值设定项 一个类对应于一个序列 在。中执行的作业 它们出现的文本顺序 类声明。 如果是静态的 构造函数(Section 10.11)存在于 类,执行静态 字段初始化程序立即发生 在执行该静态之前 构造函数。