มีคือความแตกต่างในรหัส 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 เป็นสองเท่า
อย่างไรก็ตาม: (1) ผลลัพธ์สุดท้ายนั้นเหมือนกันและ (2) คอมไพเลอร์ JIT อาจแปลทั้งสองอย่างนี้เป็นรหัสเครื่องเดียวกันได้
ดังนั้นคำตอบคือใช่มีคือความแตกต่าง - แต่ไม่ว่าคุณจะต้องกังวลเกี่ยวกับ
โดยส่วนตัวฉันจะไปหาเวอร์ชั่นที่สองเพราะนั่นเป็นการแสดงเจตนาของโปรแกรมเมอร์ได้ดีขึ้นและอาจสร้างโค้ดที่มีประสิทธิภาพมากขึ้นเล็กน้อย (ขึ้นอยู่กับสิ่งที่คอมไพเลอร์ JIT ใช้)