首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 到 IL 深度解析:第3章 選擇與循環 (3) - if-else 與區域變數作用域的 IL 實現

     編輯:關於C語言

if-else 在 IL 中的雙分支結構

IL 無 if 指令,if-else 編譯為:條件分支(brfalse)跳過 if 區塊,執行完 if 區塊後以無條件分支(br)跳過 else 區塊。

範例:簡單 if-else

// C# 代碼
class zzz {
    static bool i = true;
    public static void Main() {
        if (i)
            System.Console.WriteLine("hi");
        else
            System.Console.WriteLine("false");
    }
}

IL 流程:

  1. ldsfld 載入 i (1)。
  2. brfalse.s IL_0013:若為 0 跳至 else 區塊。
  3. 執行 if 區塊:載入 "hi"、呼叫 WriteLine。
  4. br.s IL_001d:無條件跳至結束。
  5. IL_0013:else 區塊,載入 "false"、呼叫 WriteLine。
  6. 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 的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved