6

डीएलआर के LINQ अभिव्यक्तियों में, इसके बीच क्या अंतर है:कनवर्टिंग और अनबॉक्सिंग के बीच क्या अंतर है?

Expression.Convert(SomeVariableExpression, typeof(T)); 

और यह:

Expression.Unbox(SomeVariableExpression, typeof(T)); 

इस पर प्रलेखन थोड़ा सा स्केची लगता है।

और बिंदु के लिए और अधिक, इनमें से कौन सा इस सी # कोड के बराबर है:

(ClassA)InstanceOfClassB 

जहां क्लासबी कक्षा में डालने के लिए एक अंतर्निहित या स्पष्ट ऑपरेटर है?

+1

क्षमा करें, यह दो बार पोस्ट हो गया है। हालांकि मैंने दूसरे को हटा दिया है। :-) –

+0

देखें [यह प्रश्न] (http://stackoverflow.com/q/32158399/1127114) एक विशिष्ट उदाहरण के लिए जब कनवर्ट के बजाय अनबॉक्स का उपयोग करना आवश्यक है। –

उत्तर

3

वैसे मुख्य अंतर यह है कि Epression.Unbox केवल ढेर से मूल्य प्रकार के स्पष्ट अनबॉक्सिंग के लिए आवश्यक है। Expression.Convert वह तरीका है जिसे आप उपयोगकर्ता द्वारा परिभाषित रूपांतरण (चाहे अंतर्निहित या स्पष्ट) में हुक करने के लिए उपयोग करना चाहते हैं।

Expression.Convert देखें:

या तो expression.Type या प्रकार है उपयोगकर्ता-निर्धारित प्रकार है कि एक अस्पष्ट या स्पष्ट रूपांतरण ऑपरेटर को परिभाषित करता है, MethodInfo कि कि ऑपरेटर होता को लागू करने की विधि है ।

और यह भी:

या तो expression.Type या प्रकार एक संदर्भ प्रकार और एक स्पष्ट मुक्केबाजी, unboxing, या संदर्भ रूपांतरण expression.Type से मौजूद है टाइप करने के लिए है, तो को लागू करने विधि शून्य है।

1

अभिव्यक्ति। कनवर्ट कास्ट करने के बराबर है।

+0

अनबॉक्सिंग एक मान प्रकार प्राप्त करने की प्रक्रिया है जिसे पहले बॉक्स किया गया था (दूसरे शब्दों में ढेर से मूल्य ढेर में कॉपी किया गया है और नई वस्तु का संदर्भ स्टैक पर धकेल दिया गया है)। –

2

सामान्य रूप से, मुक्केबाजी एक मूल्य प्रकार लेता है और इसे किसी ऑब्जेक्ट में लपेटता है। अनबॉक्सिंग रिवर्स करता है। आप इस बारे में सोच सकते हैं क्योंकि मुक्केबाजी एक रजिस्टर या स्टैक वैल्यू लेती है और उसे ढेर पर रखती है, उस मूल्य पर एक पॉइंटर लौटाती है। अनबॉक्सिंग एक वस्तु को ढेर पर ले जाती है और इसे एक रजिस्टर या स्टैक फ्रेम में रखती है। अंतर्निहित डेटाटाइप वही रहता है।

एक डेटाटाइप को दूसरे में परिवर्तित करें।

4

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