2012-08-31 10 views

उत्तर

26

नहीं, यह unboxing नहीं है स्पष्ट नहीं है - यह सिर्फ है कि क्या प्रकार की जाँच कर रहा है सही है। यह मत भूलना कि एक प्रकार के साथ वास्तव में एक वस्तु शामिल है। उस प्रकार की जांच करना मूल रूप से एक ही ऑपरेशन है चाहे यह मान एक बॉक्स किए गए मान प्रकार मान या नहीं है। (मूल्य प्रकारों या किसी भी मुहरबंद प्रकारों के लिए व्यवहार्य कुछ अनुकूलन हो सकते हैं, क्योंकि विचार करने के लिए कोई विरासत नहीं है, लेकिन मूल रूप से यह अभी भी ऑब्जेक्ट हेडर के "प्रकार" भाग की जांच कर रहा है।)

यह जांचने का एक तरीका संकलन करना है कोड और ILASM का उपयोग कर आईएल को देखो:

// object o = 10 
IL_0000: ldc.i4.s 10 
IL_0002: box  [mscorlib]System.Int32 
IL_0007: stloc.0 

// int i = (int) o; 
IL_0008: ldloc.0 
IL_0009: unbox.any [mscorlib]System.Int32 
IL_000e: stloc.1 

// bool isInt = o is int 
IL_000f: ldloc.0 
IL_0010: isinst  [mscorlib]System.Int32 

तो यह isinst का उपयोग करता है - कोई unboxing आवश्यक है।

+2

तो सीएलआर बिना किसी बॉक्सिंग के एक प्रकार की जांच कर सकता है? –

+3

@ViacheslavSmityukh: हां। यह मत भूलना कि एक प्रकार के साथ वास्तव में एक वस्तु शामिल है। उस प्रकार की जांच करना मूल रूप से एक ही ऑपरेशन है चाहे यह मान एक बॉक्स किए गए मान प्रकार मान या नहीं है। –

+2

@ जोनस्केट क्या आप उस टिप्पणी को उत्तर में संपादित कर सकते हैं, मुझे लगता है कि आईएल के माध्यम से सिर्फ सबूत के बजाय * क्यों * समझाया जा रहा है। – Servy

5

न केवल इसे अनबॉक्सिंग की आवश्यकता नहीं है, तार्किक रूप से, यह नहीं कर सकता है।

ऑब्बॉक्सिंग सफल या असफल हो सकती है, इस पर निर्भर करता है कि ऑब्जेक्ट में वास्तव में उस प्रकार का मान है जिसमें हम अनबॉक्स करने का प्रयास कर रहे हैं।

इसलिए, अनबॉक्सिंग के लिए यह जांच की आवश्यकता है कि ऑब्जेक्ट उस विशेष प्रकार का है या नहीं।

इसलिए, यदि प्रकार के परीक्षण unboxing आवश्यक है, तो unboxing प्रकार के परीक्षण की आवश्यकता है के बाद से, हम नहीं Unbox करने के लिए जब तक हम पहले अनबॉक्स्ड ...

इसलिए एक प्रकार का परीक्षण की आवश्यकता नहीं कर सकते हैं चाहता हूँ में सक्षम हो जाएगा unboxing।

0

सी # 7 के रूप में, is कीवर्ड ने टाइप पैटर्न के रूप में मिलान पैटर्न में एक नया उपयोग केस प्राप्त किया है। इस मामले में, unboxing होती है उदाहरण के लिए:

object o = 10; 
if (o is int i) { 
    // i is the unboxed value. 
} 

जाहिर है, यह एक अलग, आप वास्तव में मान निर्दिष्ट कर रहे हैं जब एक पैटर्न के रूप में is का उपयोग कर के रूप में मूल पोस्ट की जहां मूल्य विशुद्ध रूप से परीक्षण किया जा रहा है, के लिए मामला है। इसलिए इस मामले में अनबॉक्स करने की आवश्यकता है।

स्पष्ट होने के लिए - मूल o is int मामले के बारे में कुछ भी नहीं बदला है - पुराने उत्तरों के अनुसार, कोई अनबॉक्सिंग नहीं होगी। is कीवर्ड ने अभी एक नई भूमिका प्राप्त की है।

संबंधित मुद्दे