Я обнаружил, что статическая инициализация поля может вести себя по-разному. для следующего кода,
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, сгенерированный этими 2 строками, есть почти то же самое.
Интересно, как это происходит? И если это какая-то оптимизация JIT в сборке релизов, какова мотивация?