2016-01-04 6 views
6

मैं थोड़ा चारों ओर देखा है, लेकिन जैसे कि निम्न कैसे नई सी # 6.0 संकलक कुछ के लिए नई अशक्त प्रचार आदेश टूट जाती है के लिए एक जवाब खोजने के लिए नहीं कर पाए हैं:अशक्त प्रचार ऑपरेटर

BaseType myObj = new DerivedType(); 
string myString = (myObj as DerivedType)?.DerivedSpecificProperty; 

मैं क्या जानना चाहता हूं कि यह वास्तव में इसे कैसे संभालता है।

यह एक नया DerivedType चर में as कलाकारों को कैश करता है (अर्थात, यह एक as डाली एक अशक्त तुलना द्वारा पीछा के लिए सिर्फ वाक्य-चीनी है)।

या यदि यह वास्तव में as इसे कास्ट करता है, तो शून्य के लिए जांचें, फिर शून्य न करें, पुन: प्रयास करें और आगे बढ़ें।

उत्तर

8

यह एक नया DerivedType चर में as कलाकारों को कैश करता है (अर्थात, यह एक as डाली एक अशक्त तुलना द्वारा पीछा के लिए बस वाक्यात्मक चीनी है)।

हां।

आपका कोड कुछ इस तरह करने के लिए संकलित किया जाएगा:

BaseType myObj = new DerivedType(); 
DerivedType temp = myObj as DerivedType; 
string myString = temp != null ? temp.DerivedSpecificProperty : null; 

आप this TryRoslyn example (हालांकि साथ कि देख सकते हैं, के रूप में HVD आईएल आप देख सकते हैं को देखकर, टिप्पणी की वहाँ वास्तव में एक DerivedType चर नहीं है संदर्भ केवल ढेर पर संग्रहीत है)।

+0

अच्छा, नहीं। यदि आप सी # डीकंपिलेशन मोड बंद करते हैं और बस जांचें कि आईएल क्या उत्पन्न होता है, तो आप देखेंगे कि यह एक चर का उपयोग नहीं करता है, यह केवल स्टैक पर मान को डुप्लिकेट करने के लिए 'dup' का उपयोग करता है। – hvd

+0

@hvd ऐसा इसलिए है क्योंकि आईएल में संदर्भित केवल संदर्भ प्रकार ऑब्जेक्ट और स्ट्रिंग हैं। – phoog

+0

@phoog मुझे बिल्कुल पता नहीं है कि उस टिप्पणी से आपका क्या मतलब है। आईएल में – hvd

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