靜態構造函數總是在任何其它代碼執行之前被調用 。在C#中,靜態函數只是一個和類具有相同名稱的函數。在IL中,函數名稱改變為.cctor。因此,你可能 注意到在先前的例子中,我們使用了一個名為ctor的函數(而不需要事先定義)。
無論我們何時 調用一個無構造函數的類時,都會自動創建一個沒有參數的構造函數。這個自動生成的構造函數具有給定 的名稱.ctor。這一點,應該增強我們作為C#程序員的能力,因為我們現在正處在一個較好的位置上來理 解那些深入實質的東西。
靜態函數會被首先調用,之後,帶有entrypoint偽指令的函數會被調用 。
a.cs
class zzz
{
public static void Main()
{
System.Console.WriteLine("hi");
new zzz();
}
zzz()
{
System.Console.WriteLine("bye");
}
}
a.il
.assembly mukhi {}
.class private auto ansi zzz extends System.Object
{
.method public hidebysig static void vijay() il managed
{
.entrypoint
ldstr "hi"
call void System.Console::WriteLine(class System.String)
newobj instance void zzz::.ctor()
pop
ret
}
.method private hidebysig specialname rtspecialname instance void .ctor() il managed
{
ldarg.0
call instance void [mscorlib]System.Object::.ctor()
ldstr "bye"
call void [mscorlib]System.Console::WriteLine(class System.String)
ret
}
}
Output
hi
bye