そこ で生成された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.r8、intをdoubleに変換する必要があります。
ただし、(1)最終結果は同じであり、(2)JITコンパイラはこれらの両方を同じマシンコードに変換する可能性があります。
だから答えは:はい、あります違いがありますが、心配する必要のある違いありません。
個人的には、プログラマーの意図をよりよく表し、非常にわずかに効率的なコードを生成する可能性があるため、2番目のバージョンを使用します(JITコンパイラーが何を実行するかによって異なります)。