在IL中看起来像什么?

Dav*_*Dev 3 c# if-statement definition intermediate-language

if语句编译成IL时,语句是什么样的?

这是C#中一个非常简单的构造.sombody可以给我一个更抽象的定义,它究竟是什么?

Tim*_*mwi 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
Run Code Online (Sandbox Code Playgroud)

有一点需要注意:IL指令总是"相反".if (i > 0)转化为有效意味着"如果i <= 0,然后跳过if块体"的东西.


Mar*_*ade 5

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

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
Run Code Online (Sandbox Code Playgroud)