我想遇到一个我想了解的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
,好像跳过了实例构造函数一样。为什么呢?
答案 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
覆盖其值。