上面的代碼用來顯示靜態變量的值。.cctor函數將靜態變量初 始化為值10。然後,字符串{0}會被存儲到棧上。
ldsldfa函數加載棧上某個數據類型的靜態變量 的地址。然後,和往常一樣,進行裝箱。上面給出的關於box功能的解釋,在這裡也是相關的。
IL 中的靜態變量的工作方式和實例變量相同。唯一的區別是它們有自己的一套指令。像box這樣的指令需要 棧上的一塊內存位置,這在靜態變量和實例變量之間是沒有區別的。
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
ldstr "{0}"
ldsflda int32 zzz::i
box [mscorlib]System.Int32
call void [mscorlib]System.Console::WriteLine(class System.String, class System.Object)
ret
}
.method public hidebysig specialname rtspecialname instance void .ctor() il managed {
ldarg.0
call instance void [mscorlib]System.Object::.ctor()
ret
}
}
Output
0
在前面的程序中,唯一的變化是我們移除了靜態構造函數。所有 的靜態變量和實例變量都會被初始化為ZERO。因此。IL不會生成任何錯誤。在內部,甚至在靜態函數被調 用之前,字段i就會被分配一個初始值ZERO。
a.cs
class zzz
{
public static void Main()
{
int i = 10;
System.Console.WriteLine(i);
}
}
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)
ldc.i4.s 10
stloc.0
ldloc.0
call void [mscorlib]System.Console::WriteLine(int32)
ret
}
}
Output
10