बेल्ट के नीचे वास्तव में क्या होता है, इसके बारे में अभी तक कोई जानकारी नहीं है। इस उदाहरण पर एक नज़र डालें:
object o = "test";
if (o is string)
{
var x = (string) o;
}
यह निम्नलिखित IL का अनुवाद करता है:
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
इस परिवर्तन के बाद प्राप्त करने वाले की आवश्यकता नहीं होगी ।