C#類的靜态構造函數與C#結構體的靜态構造函數
C#類的靜态構造函數
public static void Test()
{
Class1 class1 = new Class1();
Console.WriteLine(Class1.myInt);
Console.WriteLine(“");
Class2 class2 = new Class2();
class2.myInt = 23;
Console.WriteLine(class2.myInt);
Console.WriteLine("”);
Class3 class3 = new Class3();
}
class Class1
{
static Class1()
{
Console.WriteLine("Hello from myValueType1");
// myInt = 111;
}
public static Int32 myInt;
}
class Class2
{
static Class2()
{
Console.WriteLine("Hello from myValueType2");
}
public Int32 myInt;
}
class Class3
{
static Class3()
{
Console.WriteLine("Hello from myValueType3");
myInt = 333;
}
public static Int32 myInt;
}

類的靜态構造方法會在所有這個類的調用方法之前觸發
結構體的靜态構造方法
public class Test_StaticClass
{
public static void Test()
{
Class1 class1 = new Class1();
Console.WriteLine(Class1.myInt);
Console.WriteLine(“");
Class2 class2 = new Class2();
class2.myInt = 23;
Console.WriteLine(class2.myInt);
Console.WriteLine("”);
Class3 class3 = new Class3();
}
struct Class1
{
static Class1()
{
Console.WriteLine("Hello from myValueType1");
// myInt = 111;
}
public static Int32 myInt;
}
struct Class2
{
static Class2()
{
Console.WriteLine("Hello from myValueType2");
}
public Int32 myInt;
}
struct Class3
{
static Class3()
{
Console.WriteLine("Hello from myValueType3");
myInt = 333;
}
public static Int32 myInt;
}
}

我們看到雖然三個結構中都有靜态構造器,卻隻有第一個結構的被執行了。事實上,這個有趣的現象也是CLR對性能的考慮,除非類型确實被通路到了,否則永遠不會調用到它的類型構造器,這個過程是JIT的。
當執行到第六行代碼時,CLR嘗試要去Class1查找靜态字段myInt的值。這個時候,Class1才是真正被通路到了。靜态構造器被執行,得到相應的輸出。
而Class2中myInt是個執行個體成員,通路它的值隻關系到執行個體type2執行個體。與類型本身沒有任何關系,CLR不會執行類型Class2的靜态構造器。
Class3跟Class1幾乎是一樣的,myInt是靜态成員,但是在main函數中,Class3還是沒有被真正通路到,隻是利用它構造出了一個虛拟的對象結構,這種對象結構裡面所有字段都被賦予一個0值或者null值,是以第二行輸出為零
這些性質與JIT編譯器都是分不開的。