2014年6月29日

初探 IL 藉由不同判斷寫法

在看別人的 code 時候發現對於布林變數判斷兩種不同的寫法

// 方法 1
using System;
class MainClass{
    public static void Main(){
        bool isOk = false;
        if (isOk) {
            // do something
        }
    }
}

// 方法 2
using System;
class MainClass{
    public static void Main(){
        bool isOk = false;
        if (Ok == true) {
            // do something
        }
    }
}

方法 1 是我常用的寫法,一直以來都是習慣這麼寫,對於方法 2 感覺似乎有點多餘,但不可否認,方法 2 的確是比較明顯。

想確認一下兩者寫法對於 IL 是否有任何差異。
c# 程式碼透過編譯器變成 IL(Intermediate Language) 然後在VM上面執行
於是我透過 Ildasm.exe (IL 反組譯工具) 將 exe 檔案進行反組譯看看裡面的 IL

結果如下

方法 1
.method public hidebysig static void  Main() cil managed
{
    .entrypoint
    // 程式碼大小       11 (0xb)
    .maxstack  1
    .locals init (bool V_0,
             bool V_1)
    IL_0000:  nop
    IL_0001:  ldc.i4.0
    IL_0002:  stloc.0
    IL_0003:  ldloc.0
    IL_0004:  stloc.1
    IL_0005:  ldloc.1
    IL_0006:  brtrue.s   IL_000a
 
    IL_0008:  nop
    IL_0009:  nop
    IL_000a:  ret
} // end of method MainClass::Main

方法 2
.method public hidebysig static void  Main() cil managed
{
    .entrypoint
    // 程式碼大小       11 (0xb)
    .maxstack  1
    .locals init (bool V_0,
             bool V_1)
    IL_0000:  nop
    IL_0001:  ldc.i4.0
    IL_0002:  stloc.0
    IL_0003:  ldloc.0
    IL_0004:  stloc.1
    IL_0005:  ldloc.1
    IL_0006:  brtrue.s   IL_000a
 
    IL_0008:  nop
    IL_0009:  nop
    IL_000a:  ret
} // end of method MainClass::Main
兩者沒有任何差異

Ilasm.exe (IL 組譯工具) 說明
http://msdn.microsoft.com/zh-tw/library/496e4ekx(v=vs.110).aspx

IL 範例說明
http://60-251-1-52.hinet-ip.hinet.net/taiwan/msdn/columns/DoNet/IL.htm

IL 說明
http://hi.baidu.com/fastlei/item/2cad855555b4f6444eff20fd

2 則留言:

  1. 其實我覺得只要變數名稱夠清楚,第一種寫法反而比較明顯,而且接近口語或自然語言。

    回覆刪除
    回覆
    1. 其實我的內心深處是希望有差別的~哈哈哈~這樣我才可以說你們要用第一種!!!!!XDDD

      刪除