Как выглядит if в IL? - PullRequest
       16

Как выглядит if в IL?

3 голосов
/ 08 сентября 2010

Как выглядит оператор if при компиляции в IL?

Это очень простая конструкция в C #.Может ли кто-нибудь дать мне более абстрактное определение того, что это на самом деле?

Ответы [ 4 ]

9 голосов
/ 08 сентября 2010

Вот несколько 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) означает что-то, что фактически означает «если i <= 0, то перепрыгнуть через тело блока if».

4 голосов
/ 08 сентября 2010

Используется инструкция ветвления, которая будет переходить к целевой команде в зависимости от значения (й) на вершине стека.

3 голосов
/ 08 сентября 2010

Это зависит от состояния if.Например, если вы проверяете ссылку на null, компилятор выдаст инструкцию brfalse (или brtrue в зависимости от того, что вы написали).

Условие фактическое if будет отличаться в зависимости от самого условия, но лучший способ узнать больше будет использовать диссемблер, такой как ILDASM или Reflector.

1 голос
/ 08 сентября 2010

Простой пример:

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

Другие значения будут отличаться, включая условные ветви.Это действительно слишком много, чтобы объяснить в одном посте, вам лучше поискать введение в IL-код.

По этому поводу есть хорошая статья codeproject .

...