在IL中看起来像什么?

时间:2010-09-07 23:21:24

标签: c# if-statement definition intermediate-language

if语句在编译成IL时会是什么样子?

这是C#中一个非常简单的构造。 sombody能给我一个更抽象的定义吗?

4 个答案:

答案 0 :(得分:9)

以下是一些if语句以及它们如何转换为IL:

ldc.i4.s 0x2f                      var i = 47;
stloc.0 

ldloc.0                            if (i == 47)
ldc.i4.s 0x2f
bne.un.s L_0012

ldstr "forty-seven!"                   Console.WriteLine("forty-seven!");
call Console::WriteLine

L_0012:
ldloc.0                            if (i > 0)
ldc.i4.0 
ble.s L_0020

ldstr "greater than zero!"             Console.WriteLine("greater than zero!");
call Console::WriteLine

L_0020:
ldloc.0                            bool b = (i != 0);
ldc.i4.0 
ceq 
ldc.i4.0 
ceq 
stloc.1 

ldloc.1                            if (b)
brfalse.s L_0035

ldstr "boolean true!"                  Console.WriteLine("boolean true!");
call Console::WriteLine

L_0035:
ret

有一点需要注意:IL指令总是“相反”。 if (i > 0)转换为有效意味着“if i <= 0,然后跳过if块体”的内容。

答案 1 :(得分:4)

使用分支指令,根据堆栈顶部的值跳转到目标指令。

brfalse Branch to target if value is zero (false)
brtrue  Branch to target if value is non-zero (true)
beq     Branch to target if equal
bge     Branch to target if greater than or equal to
bgt     Branch to target if greater than
ble     Branch to target if less than or equal to
blt     Branch to target if less than
bne.un  Branch to target if unequal or unordered

答案 2 :(得分:3)

这取决于if的条件。例如,如果要检查针对null的引用,编译器将发出brfalse指令(或brtrue,具体取决于您所写的内容)。

实际 if条件会因条件本身而有所不同,但像ILDASM或Reflector这样的分解器将是学习更多内容的更好工具。

答案 3 :(得分:1)

一个简单的例子:

ldloc.1                    // loads first local variable to stack
ldc.i4.0                   // loads constant 0 to stack
beq                        // branch if equal

这等于

if(i == 0) //if i is the first local variable

其他ifs会有所不同,包括条件分支。这真的太难以在一篇文章中解释,你最好寻找IL-Code的介绍。

codeproject有一篇关于此事的好文章。