尤其需要注意的是,如果IL不支持某 個特性,它就不能用任何.Net編程語言實現。從而,熟悉IL所支持的各種概念的重要性——怎 麼強調都不過分。
a.cs
class zzz
{
static bool i = true;
public static void Main()
{
if (i)
System.Console.WriteLine("hi");
else
System.Console.WriteLine("false");
}
}
a.il
.assembly mukhi {}
.class private auto ansi zzz extends System.Object
{
.fIEld private static bool i
.method public hidebysig static void vijay() il managed
{
.entrypoint
ldsfld bool zzz::i
brfalse.s IL_0013
ldstr "hi"
call void [mscorlib]System.Console::WriteLine(class System.String)
br.s IL_001d
IL_0013: ldstr "false"
call void [mscorlib]System.Console::WriteLine(class System.String)
IL_001d: ret
}
.method public hidebysig specialname rtspecialname static void .cctor() il managed
{
ldc.i4.1
stsfld bool zzz::i
ret
}
}
Output
hi
在編程語言中,if-else語句是極其容易理解的,但是在IL中它 卻是相當令人困惑的。IL檢查棧上的值是1還是0。
l 如果棧上的值是1,正如這個例子中的那樣, 它調用帶有參數hi的WriteLine函數,並隨後使用無條件跳轉指令br,跳轉到標號IL_001d。
l 如 果棧上的值是0,代碼跳轉到IL_0013,並且WriteLine函數會打印出false。
從而,為了在IL中實 現if-else結構,需要一個有條件跳轉和一個無條件跳轉。如果我們使用多個if-else語句,那麼IL代碼的 復雜度就會動態增加。
現在,可以看出編譯器的編寫者的智商了。
a.cs
class zzz
{
public static void Main()
{
}
void abc( bool a)
{
if (a)
{
int i = 0;
}
if ( a)
{
int i = 3;
}
}
}
a.il
.assembly mukhi {}
.class public auto ansi zzz extends [mscorlib]System.Object
{
.fIEld private int32 x
.method public hidebysig static void vijay() il managed
{
.entrypoint
ret
}
.method private hidebysig instance void abc(bool a) il managed
{
.locals (int32 V_0,int32 V_1)
ldarg.1
brfalse.s IL_0005
ldc.i4.0
stloc.0
IL_0005: ldarg.1
brfalse.s IL_000a
ldc.i4.3
stloc.1
IL_000a: ret
}
}