为什么静态构造函数不是先命中?

Lea*_*ner 0 .net c# static constructor

我有以下代码,我只有两个简单的问题,这些问题在下面的程序行为中是正常的,我不幸的是没有看到:

  1. 任何类中的静态构造函数应该是第一个在静态字段被命中后很快命中的构造函数.然后只有实例构造函数.但我所看到的是,调试首先进入公共构造函数.伤心的事.为什么?

虽然:该程序的输出是:

这是Staticcc ......

1

...哪个是对的.

  1. 我在Static构造函数start中保留了一个断点,但是当我调试它时,它只显示静态构造函数的结束括号中的断点.为什么?

示例代码:

public sealed class B  : A, C
{
    public   int? m = 0;
    public B()
    {
        m = 1;
    }
    private B(int a, int b)
    {
        m = 2;
    }
    protected B(int x, int y, int z)
    {
        m = 3;
    }       

    static B()
    {
        Console.WriteLine("THis is staticcc");
    }

    public static B b = new B();
    public static B BC
    {
        get
        {
            return b;
        }
    }

    static void Main()
    {           
        Console.WriteLine(B.BC.m);
        Console.ReadKey();
    }
}

public interface C
{
}

public  class A 
{
    //private A()
    //{

    //}       
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

这就是问题:

public static B b = new B();
Run Code Online (Sandbox Code Playgroud)

静态字段初始值设定项在执行静态构造函数之前执行.从C#规范部分10.5.5.1:

如果类中存在静态构造函数(10.12),则在执行该静态构造函数之前立即执行静态字段初始值设定项.

静态字段初始值设定项调用实例构造函数,因此实例构造函数是第一个执行的构造函数.

虽然:程序的输出是This is Staticcc ...然后1 ...哪个是正确的.

是的,因为所有初始化都是作为评估的一部分而发生B.BC.mMain.

如果你添加Console.WriteLine("Instance Constructor");到你的构造函数中,你会看到:

Instance Constructor
THis is staticcc
1
Run Code Online (Sandbox Code Playgroud)

如果这没有帮助,请考虑Main这样:

int tmp = B.BC.m;       // This prints initialization bits
Console.WriteLine(tmp); // This prints 1
Run Code Online (Sandbox Code Playgroud)