IL 無 if 指令,if-else 編譯為:條件分支(brfalse)跳過 if 區塊,執行完 if 區塊後以無條件分支(br)跳過 else 區塊。
// C# 代碼
class zzz {
static bool i = true;
public static void Main() {
if (i)
System.Console.WriteLine("hi");
else
System.Console.WriteLine("false");
}
}
IL 流程:
ldsfld 載入 i (1)。brfalse.s IL_0013:若為 0 跳至 else 區塊。if 區塊:載入 "hi"、呼叫 WriteLine。br.s IL_001d:無條件跳至結束。IL_0013:else 區塊,載入 "false"、呼叫 WriteLine。IL_001d:ret。.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(string)
br.s IL_001d
IL_0013: ldstr "false"
call void [mscorlib]System.Console::WriteLine(string)
IL_001d: ret
}
輸出:hi。
同一方法中兩個 if 區塊各宣告 int i,C# 允許因作用域隔離;IL 編譯為兩個不同區域變數 V_0、V_1,體現 IL 無區塊作用域特性。
.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
}
IL 僅提供分支指令,高階語言的控制結構(if、循環)皆由編譯器映射為標籤與條件/無條件跳轉。理解此映射關係是掌握 IL 的關鍵。