Orada ise üretilen IL kodundaki bir fark vardır.
Bu sınıf:
class Test1
{
public readonly double Val;
public Test1(bool src)
{
this.Val = src ? 1 : 0;
}
}
Yapıcı için bu IL kodunu üretir:
.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
}
}
Ve bu sınıf:
class Test2
{
public readonly double Val;
public Test2(bool src)
{
this.Val = src ? 1d : 0d;
}
}
Yapıcı için bu IL kodunu üretir:
.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
}
}
Gördüğünüz gibi, ilk versiyonda conv.r8int'i ikiye dönüştürmek için aramak zorunda.
Ancak: (1) Sonuç aynıdır ve (2) JIT derleyicisi her ikisini de aynı makine koduna iyi çevirebilir.
Cevaptır Yani: Evet, bir - ama hakkında endişe gerektiğini değil bir fark.
Şahsen, programcı niyeti daha iyi ifade ettiğinden ikinci versiyonu için gitmek istiyorum, ve olabilir (JIT derleyicisi kadar alır ne bağlı olarak) çok çok biraz daha verimli kod üretir.