거기 이다 생성 IL 코드의 차이.
이 수업 :
class Test1
{
public readonly double Val;
public Test1(bool src)
{
this.Val = src ? 1 : 0;
}
}
생성자를 위해이 IL 코드를 생성합니다.
.class private auto ansi beforefieldinit Demo.Test1
extends [mscorlib]System.Object
{
.field public initonly float64 Val
.method public hidebysig specialname rtspecialname instance void .ctor (
bool src
) cil managed
{
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ldarg.0
IL_0007: ldarg.1
IL_0008: brtrue.s IL_000d
IL_000a: ldc.i4.0
IL_000b: br.s IL_000e
IL_000d: ldc.i4.1
IL_000e: conv.r8
IL_000f: stfld float64 Demo.Test1::Val
IL_0014: ret
}
}
그리고이 수업은 :
class Test2
{
public readonly double Val;
public Test2(bool src)
{
this.Val = src ? 1d : 0d;
}
}
생성자를 위해이 IL 코드를 생성합니다.
.class private auto ansi beforefieldinit Demo.Test2
extends [mscorlib]System.Object
{
.field public initonly float64 Val
.method public hidebysig specialname rtspecialname instance void .ctor (
bool src
) cil managed
{
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ldarg.0
IL_0007: ldarg.1
IL_0008: brtrue.s IL_0015
IL_000a: ldc.r8 0.0
IL_0013: br.s IL_001e
IL_0015: ldc.r8 1
IL_001e: stfld float64 Demo.Test2::Val
IL_0023: ret
}
}
보시다시피, 첫 번째 버전에서는 conv.r8int를 double로 변환하기 위해 호출 해야합니다.
그러나 (1) 최종 결과는 동일하며 (2) JIT 컴파일러는이 두 가지를 모두 동일한 기계 코드로 변환 할 수 있습니다.
대답은 그래서 : 네, 있습니다 -하지만 당신은 걱정할 필요가없는 하나의 차이.
개인적으로, 나는 프로그래머의 의도를 더 잘 표현 하고 JIT 컴파일러가 얻는 것에 따라 매우 약간 더 효율적인 코드를 생성 할 수 있기 때문에 두 번째 버전으로 갈 것입니다 .