C#静态字段,实例构造函数

Pio*_*otr 13 .net c# static constructor

我遇到了一个我想了解的C#行为.考虑这样一个类:

public class SomeSingleton
{
    public static SomeSingleton Default = new SomeSingleton();

    private static int field = 0;

    private SomeSingleton()
    {
        field = 1;
    }

    public int GetField()
    {
        return field;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,让我们调用GetField()方法:

var field = SomeSingleton.Default.GetField();
Run Code Online (Sandbox Code Playgroud)

我得到的0好像是跳过了实例构造函数.为什么?

Hab*_*bib 26

只需交换field声明的顺序Default.

所以你的台词:

public static SomeSingleton Default = new SomeSingleton();
private static int field = 0;
Run Code Online (Sandbox Code Playgroud)

应该:

private static int field = 0;
public static SomeSingleton Default = new SomeSingleton();
Run Code Online (Sandbox Code Playgroud)

原因是由于字段初始化顺序.首先Default在您的代码中初始化,它分配field1.之后该字段0在初始化时分配.因此,您可以看到最新的价值0而不是1.

请参阅:10.4.5.1静态字段初始化

类的静态字段变量初始值设定项对应于以它们出现在类声明中的文本顺序执行的赋值序列.


Pat*_*man 7

这是因为static变量的排序.如果切换两个语句,输出将变为1:

private static int field = 0;

public static SomeSingleton Default = new SomeSingleton();
Run Code Online (Sandbox Code Playgroud)

这是MSDN中记录的预期行为:静态字段初始化.

看到这个.NET小提琴.

  • +1感谢您提供.NET Fiddle的链接,这是一款出色的工具. (4认同)