বেল্টের নীচে আসলে কী ঘটে যায় সে সম্পর্কে এখনও কোনও তথ্য নেই। এই উদাহরণটি একবার দেখুন:
object o = "test";
if (o is string)
{
var x = (string) o;
}
এটি নিম্নলিখিত আইএলে অনুবাদ করে:
IL_0000: nop
IL_0001: ldstr "test"
IL_0006: stloc.0 // o
IL_0007: ldloc.0 // o
IL_0008: isinst System.String
IL_000D: ldnull
IL_000E: cgt.un
IL_0010: stloc.1
IL_0011: ldloc.1
IL_0012: brfalse.s IL_001D
IL_0014: nop
IL_0015: ldloc.0 // o
IL_0016: castclass System.String
IL_001B: stloc.2 // x
IL_001C: nop
IL_001D: ret
এখানে যা গুরুত্বপূর্ণ তা হ'ল isinst
এবং castclass
কলগুলি - উভয়ই তুলনামূলকভাবে ব্যয়বহুল। আপনি যদি বিকল্পটির সাথে এটি তুলনা করেন তবে দেখতে পাবেন এটি কেবল একটি isinst
চেক করে:
object o = "test";
var oAsString = o as string;
if (oAsString != null)
{
}
IL_0000: nop
IL_0001: ldstr "test"
IL_0006: stloc.0 // o
IL_0007: ldloc.0 // o
IL_0008: isinst System.String
IL_000D: stloc.1 // oAsString
IL_000E: ldloc.1 // oAsString
IL_000F: ldnull
IL_0010: cgt.un
IL_0012: stloc.2
IL_0013: ldloc.2
IL_0014: brfalse.s IL_0018
IL_0016: nop
IL_0017: nop
IL_0018: ret
উল্লেখ করার মতো বিষয় হ'ল একটি মান ধরণের unbox.any
পরিবর্তে ব্যবহৃত হবে castclass
:
object o = 5;
if (o is int)
{
var x = (int)o;
}
IL_0000: nop
IL_0001: ldc.i4.5
IL_0002: box System.Int32
IL_0007: stloc.0 // o
IL_0008: ldloc.0 // o
IL_0009: isinst System.Int32
IL_000E: ldnull
IL_000F: cgt.un
IL_0011: stloc.1
IL_0012: ldloc.1
IL_0013: brfalse.s IL_001E
IL_0015: nop
IL_0016: ldloc.0 // o
IL_0017: unbox.any System.Int32
IL_001C: stloc.2 // x
IL_001D: nop
IL_001E: ret
তবে মনে রাখবেন, এই অগত্যা একটি দ্রুত অনুবাদ ফলে আমরা দেখতে পারি এখানে । যদিও এই প্রশ্নটি জিজ্ঞাসা করার পরেও উন্নতি হয়েছে বলে মনে হচ্ছে: বর্ণগুলি আগে যেভাবে করা হত তত দ্রুত সঞ্চালিত হয়েছে বলে মনে হয় as
এবং linq
এখন প্রায় 3 গুণ দ্রুত।
MyProp
এই পরিবর্তনের পরে আপনার দরকার হবে না ।