這一篇是IL系列的最後一篇的,主要是要說一下IL中的流程控制。我相信,經過前面三篇的介紹,看IL代碼應該不是什麼大問題了吧。好吧,閒話不多說了,就來簡單的說一下吧。
還是跟前幾篇一樣,以例子來解釋說明。
轉換為IL代碼如下:
大家是否看到了上圖中我畫的紅色框框,這個就是流程控制的關鍵,下面我最後一次一句一句去解釋,希望大家能夠自己去嘗試一下,看一下。
.method private hidebysig static void Main(string[] args)cilmanaged { .entrypoint //代表該函數程序的入口函數 .maxstack 2 //評估棧可容納數據項的最大個數 .locals init ( [0] int32 num, [1] bool flag) //聲明兩個變量,第一個是int類型,第二個是bool類型 L_0000: nop //No Operation L_0001: ldc.i4.2 //把數值2以4字節長度整數的形式壓入評估棧 L_0002: stloc.0 //把評估棧棧頂的值彈出,並賦值給第0個局部變量num,等於i=2的C#代碼 L_0003: ldloc.0 //把第0個變量壓入評估棧,即把變量num壓入評估棧 L_0004: ldc.i4.0 //把數值0以4字節長度整數的形式壓入評估棧 L_0005: cgt //執行大於指令操作,比較num和0,結果存儲在評估棧棧頂,1表示真,即i>0為真 L_0007: stloc.1 //把大於指令的運算結果從評估棧彈出,並賦值給第1個變量flag L_0008: ldloc.1 //把第1個變量壓入評估棧,即把變量flag壓入評估棧 L_0009: brfalse.s L_001a //如果brfalse為false,空引用或0,將控制轉移到目標指令。在這裡,因為i>0是為真,所以按順序執行,不必跳到L_001a. L_000b: nop //No Operation L_000c: ldstr "i\u4e3a\u6574\u6570" //把字符串“i為整數”壓入評估棧 L_0011: call void [mscorlib]System.Console::WriteLine(string)//調用WriteLine方法。 L_0016: nop L_0017: nop L_0018: br.s L_0027 //無條件地將控制轉移到目標指令(短格式)。轉移到調用ReadKey方法。 L_001a: nop L_001b: ldstr "i\u4e3a\u8d1f\u6570"//把字符串“i為負數”壓入評估棧 L_0020: call void [mscorlib]System.Console::WriteLine(string)//調用WriteLine方法。 L_0025: nop L_0026: nop L_0027: call valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey() L_002c: pop //清空評估棧的內容 L_002d: ret
好喽,這樣就完整了噢。一般常用的指令都有說明。如果你在平時遇到了不懂的指令,可以到這裡看看(IL指令),Ctrl+F一下,你就應該知道了。
其實我也是一名初學者,如果有什麼問題的話,希望大家也可以提出來,我會進行改進。