Pregunta

El siguiente C#-snippet:

var x = 1;
var y = 1;
if (x == y)
    Console.Write("True");

Genera este msil:

.locals init (
            [0] int32 x,
            [1] int32 y,
            [2] bool CS$4$0000)
L_0000: nop 
L_0001: ldc.i4.1 
L_0002: stloc.0 
L_0003: ldc.i4.1 
L_0004: stloc.1 
L_0005: ldloc.0 
L_0006: ldloc.1 
L_0007: ceq 
L_0009: ldc.i4.0 
L_000a: ceq 
L_000c: stloc.2 
L_000d: ldloc.2 
L_000e: brtrue.s L_001b
L_0010: ldstr "True"
L_0015: call void [mscorlib]System.Console::Write(string)
L_001a: nop 
L_001b: ret 

¿Por qué hay dos? ceq llamadas?

Gracias

¿Fue útil?

Solución

El segundo ceq OpCode compara el resultado del primero en 0. (false)

Este resultado se coloca en una variable, se carga desde la variable y, si fue true, la WriteLine la llamada se omite.

Supongo que el modo de lanzamiento genera un código más eficiente, pero soy demasiado vago para verificar.

Otros consejos

Sobre comparar valores con ceq De MSDN:

Si son iguales, el valor entero 1 (int32) se empuja a la pila de evaluación; de lo contrario, 0 (int32) se empuja a la pila de evaluación.

El segundo ceq Comprueba si la primera comparación falló, si es así, salta al punto de salida.

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