Pregunta

¿Qué hace una mirada comunicado if como cuando se compila en IL?

Es una construcción muy simple en C #. Sombody puede darme una definición más abstracta de lo que realmente es?

¿Fue útil?

Solución

Aquí están algunas declaraciones if y cómo se traducen a 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

Hay que destacar aquí: La IL instrucciones son siempre el “opuesto”. if (i > 0) traduce a algo que significa efectivamente “si i <= 0, y luego saltar sobre el cuerpo del bloque if”.

Otros consejos

una instrucción de ramificación que se utiliza saltará a una instrucción de objetivo en función del valor (s) en la parte superior de la pila.

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

Depende de la condición de la if. Por ejemplo, si usted está mirando una referencia frente a null el compilador emitirá un brfalse instrucción (o un brtrue dependiendo de lo que ha escrito).

El real condición if será diferente según la condición de sí mismo sino un dissasembler como ILDASM o reflector sería una mejor herramienta para aprender más.

Un simple ejemplo:

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

Esto sería igual a

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

Otros ifs sería diferente, incluyendo ramas condicionales. Esto realmente es demasiado para explicar en un solo post, usted es mejor de buscar una introducción a la IL-Código.

Hay un buen artículo sobre CodeProject respecto a esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top