2008-12-17 23 views
6

मैं समझता हूं कि मुक्केबाजी और अनबॉक्सिंग कास्टिंग (वस्तु के वास्तविक प्रकार ... वास्तविक प्रकार के लिए वस्तु) के बारे में है। लेकिन मुझे समझ में नहीं आता कि एमएसडीएन ने इसके बारे में क्या कहा है।बॉक्सिंग/अनबॉक्सिंग और निरर्थक?

जब एक नल प्रकार बॉक्सिंग जाता है, आम भाषा क्रम स्वचालित रूप से बॉक्स Nullable वस्तु के अंतर्निहित कीमत, नहीं Nullable वस्तु ही: यहाँ पाठ मुझे समझ नहीं आता है। यही है, अगर HasValue संपत्ति सत्य है, तो मूल्य संपत्ति की सामग्री को बॉक्स किया गया है। जब एक शून्य प्रकार के अंतर्निहित मूल्य को अनबॉक्स किया जाता है, तो सामान्य भाषा रनटाइम अंतर्निहित मान में प्रारंभ की गई एक नई नलिका संरचना बनाता है। Source

जब आप कोई वास्तविक प्रकार, वास्तविक प्रकार चर कि नल वस्तु के प्रकार के हो जाएगा था करने के लिए अपने वस्तु बदलते हैं? मुझे यह समझ नहीं आया?

int? x = 5; 
object y = x; // Boxing 

आप एक बॉक्स्ड int, नहीं एक बॉक्सिंग Nullable<int> साथ अंत:

+0

ग्रेट दिमाग एक जैसे सोचते हैं। (सीएफ @ जोन और @ मर्क) – harpo

+2

ग्रेट दिमाग को एसओ से छुट्टियां लेने की आवश्यकता है :) – mackenir

उत्तर

10

क्या यह कह रहा है कि अगर आप क्या करते हैं। इसी तरह यदि आप करते हैं:

int? x = null; // Same as new Nullable<int>() - HasValue = false; 
object y = x; // Boxing 

फिर वाई शून्य संदर्भ के रूप में समाप्त होता है।

+4

लॉल! शुद्ध संयोग, लेकिन दूसरे मामले में कम से कम –

+0

@ जोन डरावना नहीं है, कोई मुक्केबाजी नहीं है, दस्तावेज़ीकरण इसके बारे में स्पष्ट है। यह सिर्फ एक शून्य संदर्भ असाइन करता है। केवल जब 'HasValue' ध्वज सत्य है (गैर शून्य मान), अंतर्निहित मान प्रकार बॉक्स किया गया है।के बारे में स्पॉट * आप एक बॉक्स वाले 'int' के साथ समाप्त होते हैं, न कि बॉक्स किए गए' Nullable '*, मुझे स्वयं गलत धारणा थी। – nawfal

+0

@nawfal: यह एक शून्य संदर्भ निर्दिष्ट करता है, लेकिन यह एक मुक्केबाजी ऑपरेशन है जो एक शून्य संदर्भ उत्पन्न करता है। जेनरेट किए गए आईएल में देखें (मैं बस दो बार चेक किया गया) - यह 'बॉक्स' निर्देश का उपयोग कर रहा है। "मुक्केबाजी ऑपरेशन" और "एक ऑपरेशन जो एक बॉक्स किए गए मान को लौटाता है" आईएमओ के बीच एक अंतर है। आप किस दस्तावेज का जिक्र कर रहे थे? –

8

क्या इसका मतलब है कि यह है कि अगर आप ऐसा करेंगे:

int? i = 5; 
object o = i; 

यह एक "पूर्णांक" (5) कि बॉक्सिंग जाता है, नहीं एक "पूर्णांक?" है (5)। यदि एक्स शून्य (! HasValue) था, तो शून्य होगा, खाली "int?" के आस-पास एक बॉक्स नहीं

फिर जब आप Unbox:

i = (int?)o; 

तो ओ रिक्त है, मैं एक खाली हो जाता है, "पूर्णांक?" अन्यथा, 5 अनबॉक्स किया गया है और "नया int? (5)" बनाने के लिए उपयोग किया जाता है।

मूल रूप से, आप (धोखाधड़ी से कम) एक बॉक्स्ड nullable<T> सीधे प्राप्त कर सकेंगे नहीं करना चाहिए - केवल एक बॉक्स्ड T

+1

तो, हम दोनों कैसे हमारे उदाहरण मूल्य के रूप में 5 उठाया? हम्म ... –

+0

यह 42 कैसे नहीं है? –

+0

"यदि एक्स शून्य था" होना चाहिए "अगर मैं शून्य था" ... x वैरिएबल JonSkeet उदाहरण पर है ... आपने i का उपयोग किया था। –

3

एक Nullable<T>null है, यह एक अशक्त संदर्भ के रूप में बॉक्सिंग हो जाएगा और नहीं होगा HasValue = true के साथ बॉक्स किए गए मान प्रकार के रूप में व्यवहार करें।

वास्तव में, इस सुविधा को लागू करने के लिए, यह आवश्यक था कि सीएलआर आंतरिक रूप से Nullable<T> प्रकार का समर्थन करे और इसे अलग-अलग व्यवहार करें। डेवलपर अपना खुद का प्रकार नहीं लिख सकते हैं जो Nullable<T> जैसा काम करता है।

यह ध्यान देने योग्य है कि यह देर से .NET 2.0 सुविधाओं में से एक था। शुरुआती बीटा में, Nullable<T> एक सामान्य संरचना की तरह व्यवहार किया। अंतिम रिलीज में, इसे बॉक्स में शून्य संदर्भ में बदल दिया गया था। यह परिवर्तन विशेष रूप से एसक्यूएल सर्वर सीएलआर टीम के लिए तोड़ रहा था और उन्हें इसके लिए कुछ मौलिक सामान बदलना पड़ा।

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