वहाँ है उत्पन्न आईएल कोड में एक फर्क।
यह क्लास:
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इंट को डबल में बदलने के लिए कॉल करना है।
हालाँकि: (1) अंतिम परिणाम समान है और (2) JIT कंपाइलर इन दोनों को एक ही मशीन कोड में अच्छी तरह से अनुवादित कर सकता है।
तो जवाब है: हाँ, वहाँ है - लेकिन एक है कि आप के बारे में चिंता करने की जरूरत है एक फर्क।
व्यक्तिगत रूप से, मैं दूसरे संस्करण के लिए जाऊंगा क्योंकि यह प्रोग्रामर के इरादे को बेहतर ढंग से व्यक्त करता है, और बहुत ही अधिक कुशल कोड का उत्पादन कर सकता है (जो कि जेआईटी कंपाइलर पर निर्भर करता है)।