你可能還會注意到,基類的構造函數會被首先執行,隨後, 也只能是隨後,在構造函數中編寫的代碼才會被調用。
這種收獲肯定會增強你對C#和IL的理解。
a.cs
class zzz
{
public static void Main()
{
System.Console.WriteLine(10);
}
}
a.il
.assembly mukhi {}
.class private auto ansi zzz extends System.Object
{
.method public hidebysig static void vijay() il managed
{
.entrypoint
ldc.i4.s 10
call void [mscorlib]System.Console::WriteLine(int32)
ret
}
}
Output
10
通過重載WriteLine函數,我們能夠打印出一個數字而不是字符 串。
首先,我們使用ldc語句把值10放到棧上。仔細觀察,現在這個指令是ldc.i4.s,那麼值就是 10。任何指令都在內存中獲取4個字節,但是當以.s結尾時則只獲取1個字節。
隨後,C#編譯器調 用正確的WriteLine函數的重載版本,它從棧上接受一個int32值。
這類似於打印出來的字符串:
a.cs
class zzz
{
public static void Main()
{
System.Console.WriteLine("{0}", 20);
}
}
a.il
.assembly mukhi {}
.class private auto ansi zzz extends System.Object
{
.method public hidebysig static void vijay() il managed
{
.entrypoint
.locals (int32 V_0)
ldstr "{0}"
ldc.i4.s 20
stloc.0
ldloca.s V_0
box [mscorlib]System.Int32
call void [mscorlib]System.Console::WriteLine(class System.String,class System.Object)
ret
}
}
Output
20