我們將局部變量i初始化為值0。這是不能在構造函數中完成的 ,因為變量i還沒有在棧上被創建。然後,使用stloc.0來分配值10到V_0。之後,使用ldloc.0來把變量 V_0放到棧上,從而它對於WriteLine函數是可用的。
之後,Writeline函數在屏幕上顯示這個值。 字段和本地變量具有類似的行為,只有一點不同——它們使用不同的指令。
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)
ldloc.0
call void [mscorlib]System.Console::WriteLine(int32)
ret
}
}
Output
51380288
所有的局部變量都必須被初始化,否則,編譯器就會生 成一個莫名其妙的錯誤信息。這裡,即使我們注釋了ldc和stloc指令,也不會有錯誤在運行時生成。然而 ,會顯示一個非常巨大的數字。
變量V_0沒有被初始化為任何值,它是在棧上創建的,並包括在內 存位置上分配給它的任何可用的值。在你我機器上的輸出會有很大不同。
在類似的情況中,C#編 譯器將丟給你一個錯誤,並且不允許你進一步繼續下去,因為變量還沒有被初始化。另一方面,IL是一個 “怪胎”。它的要求是很寬松的。它生成非常少的錯誤或在源代碼上進行非常少的健康檢查。 但也存在缺點,就是說,程序員在使用IL時不得不更加小心和盡職盡責。
a.cs
class zzz
{
static int i;
public static void Main()
{
i = 10;
System.Console.WriteLine("{0}",i);
}
}
a.il
.assembly mukhi {}
.class private auto ansi zzz extends System.Object
{
.fIEld private static int32 i
.method public hidebysig static void vijay() il managed
{
.entrypoint
ldc.i4.s 10
stsfld int32 zzz::i
ldstr "{0}"
ldsflda int32 zzz::i
box [mscorlib]System.Int32
call void [mscorlib]System.Console::WriteLine(class System.String,class System.Object)
ret
}
}
Output
10