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

时间:2010-11-10 23:34:36

标签: c# static constructor

亲爱的,像这样的问题一直是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()完成了

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

1 个答案:

答案 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)存在于   类,执行静态   字段初始化程序立即发生   在执行该静态之前   构造函数。