在IL中看起来像什么?
if
语句在编译成IL时会是什么样子?
这是C#中一个非常简单的构造。 sombody可以给我一个更抽象的定义,它究竟是什么?
以下是一些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
块的主体”的东西。
使用分支指令,该指令将根据堆栈顶部的值跳转到目标指令。
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
这取决于if
的条件。 例如,如果您正在检查对null
的引用,则编译器将发出brfalse
指令(或brtrue
具体取决于您所写的内容)。
实际 if
条件将根据条件本身而有所不同,但像ILDASM或Reflector这样的分解器将是学习更多知识的更好工具。
一个简单的例子:
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的文章。