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

时间:2014-07-24 15:24:44

标签: c# .net constructor static

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

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

    private static int field = 0;

    private SomeSingleton()
    {
        field = 1;
    }

    public int GetField()
    {
        return field;
    }
}

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

var field = SomeSingleton.Default.GetField();

我得到了0,好像跳过了实例构造函数一样。为什么呢?

3 个答案:

答案 0 :(得分:26)

field之前交换Default声明的顺序。

所以你的界限:

public static SomeSingleton Default = new SomeSingleton();
private static int field = 0;

应该是:

private static int field = 0;
public static SomeSingleton Default = new SomeSingleton();

原因是由于字段初始化顺序。首先在您的代码中初始化Default,该代码将field的值分配为1。稍后在初始化中为该字段分配0。因此,您会看到0而不是1的最新值。

请参阅:10.4.5.1 Static field initialization

  

类的静态字段变量初始值设定项对应于a   以文本顺序执行的分配顺序   它们出现在课堂宣言中。

答案 1 :(得分:7)

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

private static int field = 0;

public static SomeSingleton Default = new SomeSingleton();

这是MSDN: Static field initialization中记录的预期行为。

请参阅this .NET Fiddle

答案 2 :(得分:3)

切换静态变量的顺序。

private static int field = 0;
public static SomeSingleton Default = new SomeSingleton();

在您的代码中,构造函数首先运行,设置field,然后field覆盖其值。