我发现静态字段初始化的行为可能有所不同。对于以下代码,
public class Class1
{
public static void Main()
{
Console.WriteLine("Main");
Test();
Console.ReadLine();
}
public static void Test(){
Console.WriteLine("Test");
Singleton.Instance.DoSomething();
}
}
public class Singleton
{
private static Singleton sInstance = new Singleton();
protected Singleton()
{
Console.WriteLine("Singleton Constructor");
}
public static Singleton Instance
{
get
{
return sInstance;
}
}
public void DoSomething(){}
}
在调试版本中,它将打印
Main
Test
Singleton Constructor
在发布版本中,它将打印
Main
Singleton Constructor
Test
我检查了这两个版本生成的IL代码,几乎是相同的。
我想知道这是怎么发生的?如果它是发布构建中的一种 JIT 优化,那么动机是什么?
它完全取决于静态初始化器何时执行的实现。所以顺序可能会有所不同。但是,如果您提供静态构造函数,这些静态初始值设定项将始终更早执行。因此,输出将按一致的顺序排列。
From MSDN http://msdn.microsoft.com/en-us/library/aa645758.aspx
类的静态字段变量初始值设定项对应于一系列赋值,这些赋值按它们在类声明中出现的文本顺序执行。如果类中存在静态构造函数(第 10.11 节),则在执行该静态构造函数之前立即执行静态字段初始值设定项。否则,静态字段初始值设定项将在首次使用该类的静态字段之前的依赖于实现的时间执行。
Add a 静态构造函数 http://msdn.microsoft.com/en-us/library/k9x6w0hc.aspx in the Singleton
class
static Singleton() { }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)