Comparación variable
-
21-09-2019 - |
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
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