Ada adalah perbedaan dalam kode IL yang dihasilkan.
Kelas ini:
class Test1
{
public readonly double Val;
public Test1(bool src)
{
this.Val = src ? 1 : 0;
}
}
Menghasilkan kode IL ini untuk konstruktor:
.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
}
}
Dan kelas ini:
class Test2
{
public readonly double Val;
public Test2(bool src)
{
this.Val = src ? 1d : 0d;
}
}
Menghasilkan kode IL ini untuk konstruktor:
.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
}
}
Seperti yang Anda lihat, dalam versi pertama ia harus memanggil conv.r8untuk mengkonversi int menjadi ganda.
Namun: (1) Hasil akhirnya identik dan (2) kompiler JIT dapat menerjemahkan keduanya ke kode mesin yang sama.
Jadi jawabannya adalah: Ya, ada adalah perbedaan - tapi tidak satu yang Anda perlu khawatir tentang.
Secara pribadi, saya akan menggunakan versi kedua karena itu lebih baik mengekspresikan maksud programmer, dan dapat menghasilkan kode yang sangat sangat sedikit lebih efisien (tergantung pada apa yang dilakukan kompiler JIT).