मूल कारण / समस्या यह है कि CLS विनिर्देशन के डिज़ाइनर (जो परिभाषित करते हैं कि कैसे भाषाएं .net के साथ परस्पर क्रिया करती हैं) ने एक ऐसे साधन को परिभाषित नहीं किया है जिसके द्वारा वर्ग के सदस्य निर्दिष्ट कर सकते हैं कि उन्हें सीधे बुलाया जाना चाहिए, बजायcallvirt
कॉल करने के बिना अशक्त-संदर्भ जाँच; न ही यह परिभाषित संरचनाओं का एक माध्यम प्रदान करता है जो "सामान्य" मुक्केबाजी के अधीन नहीं होगा।
सीएलएस विनिर्देश को ऐसे साधनों के रूप में परिभाषित किया गया था, तो यह संभव हो जाएगा। इसके लिए कॉमन ऑब्जेक्ट मॉडल (COM) द्वारा स्थापित लीड का लगातार पालन करें, जिसके तहत एक शून्य स्ट्रिंग संदर्भ को खाली स्ट्रिंग के समान शब्दार्थ माना जाता था, और अन्य के लिए उपयोगकर्ता-परिभाषित अपरिवर्तनीय वर्ग प्रकार जिन्हें डिफ़ॉल्ट मानों को परिभाषित करने के लिए मूल्य शब्दार्थ माना जाता है। अनिवार्य रूप से, प्रत्येक सदस्य के लिए क्या होगा String
, जैसे Length
कुछ लिखा जाना चाहिए [InvokableOnNull()] int String Length { get { if (this==null) return 0; else return _Length;} }
। इस दृष्टिकोण ने उन चीजों के लिए बहुत अच्छे शब्दार्थ की पेशकश की है, जिन्हें मूल्यों की तरह व्यवहार करना चाहिए, लेकिन कार्यान्वयन के मुद्दों को ढेर पर संग्रहीत करने की आवश्यकता है। इस दृष्टिकोण के साथ सबसे बड़ी कठिनाई यह है कि ऐसे प्रकारों के बीच रूपांतरण के शब्दार्थ और Object
थोड़ा मुरझाना हो सकता है।
एक वैकल्पिक दृष्टिकोण विशेष संरचना प्रकारों की परिभाषा को अनुमति देने के लिए होता था जो कि विरासत में नहीं मिला था, Object
लेकिन इसके बजाय कस्टम बॉक्सिंग और अनबॉक्सिंग ऑपरेशन थे (जो कि कुछ अन्य प्रकार से / में परिवर्तित हो जाएंगे)। इस तरह के दृष्टिकोण के तहत, एक वर्ग प्रकार होगा NullableString
जो स्ट्रिंग के रूप में व्यवहार करता है, और एक कस्टम-बॉक्सेड संरचना प्रकार String
, जो एकल Value
प्रकार का एक निजी क्षेत्र धारण करेगाString
। एक कन्वर्ट करने के लिए प्रयास कर रहा है String
करने के लिए NullableString
या Object
वापसी होगी Value
यदि गैर-शून्य, या String.Empty
अशक्त है। कास्ट करने की कोशिश कर रहा है String
, NullableString
उदाहरण के लिए एक गैर-शून्य संदर्भ में संदर्भ को संग्रहीत किया जाएगा Value
(शायद लंबाई शून्य होने पर शून्य को संग्रहीत करना); किसी भी अन्य संदर्भ कास्टिंग एक अपवाद फेंक देंगे।
हालांकि तार को ढेर पर संग्रहीत किया जाना है, फिर भी वैचारिक रूप से कोई कारण नहीं है कि उन्हें क्यों नहीं करना चाहिए मूल्य प्रकार की तरह व्यवहार करना , जिसमें एक गैर-शून्य डिफ़ॉल्ट मान है। उन्हें एक "सामान्य" संरचना के रूप में संग्रहीत किया जाता है, जो एक संदर्भ होता है जो कोड के लिए कुशल होता है जो उन्हें "स्ट्रिंग" के रूप में उपयोग करता है, लेकिन "ऑब्जेक्ट" के लिए कास्टिंग करते समय अप्रत्यक्ष और अक्षमता की एक अतिरिक्त परत जोड़ देगा। हालांकि, मैं इस देर की तारीख में उपरोक्त सुविधाओं में से किसी को भी शामिल नहीं करता हूं। शायद भविष्य के रूपरेखा के डिजाइनर उन पर विचार कर सकते हैं।