সেখানে হয় উত্পন্ন আইএল কোড মধ্যে একটি পার্থক্য।
এই বর্গ:
class Test1
{
public readonly double Val;
public Test1(bool src)
{
this.Val = src ? 1 : 0;
}
}
কনস্ট্রাক্টরের জন্য এই আইএল কোডটি উত্পাদন করে:
.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;
}
}
কনস্ট্রাক্টরের জন্য এই আইএল কোডটি উত্পাদন করে:
.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 রূপান্তর কল করতে হবে।
তবে: (১) শেষ ফলাফলটি অভিন্ন এবং (২) জেআইটি সংকলক উভয়কে একই মেশিন কোডে ভালভাবে অনুবাদ করতে পারে।
তাই এর জবাব হচ্ছে, হ্যাঁ, হয় - কিন্তু না যে এক আপনার সম্পর্কে চিন্তা করতে হবে একটি পার্থক্য।
ব্যক্তিগতভাবে, আমি দ্বিতীয় সংস্করণে যাব কারণ এটি প্রোগ্রামারের অভিপ্রায়টি আরও ভালভাবে প্রকাশ করে এবং খুব সামান্য আরও কার্যকর কোড তৈরি করতে পারে (জেআইটি সংকলক কীসের উপর নির্ভর করে)।