Si lo que hace un aspecto como el de la IL?
-
01-10-2019 - |
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?
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.