2009-03-27 8 views
33

क्यों सी # में डेटटाइम को शून्य करने की अनुमति नहीं है? यह कैसे लागू किया गया है? और क्या इस सुविधा का उपयोग अपनी कक्षाओं को गैर-शून्य बनाने के लिए किया जा सकता है?सी # में डेटटाइम के लिए शून्य की अनुमति क्यों नहीं है?

उदाहरण:

string stringTest = null; // Okay 
DateTime dateTimeTest = null; // Compile error 

मुझे पता है कि मैं सी # 2.0 में DateTime? का उपयोग dateTimeTest को सौंपा जा करने के लिए अशक्त अनुमति देने के लिए कर सकते हैं और मैं अपने स्ट्रिंग पर Jon Skeet's NonNullable class का उपयोग के काम पर एक रन टाइम त्रुटि प्राप्त करने के लिए कर सकता है कि stringTest। मैं बस सोच रहा हूं कि दो प्रकार अलग तरीके से क्यों व्यवहार करते हैं।

+0

यह जॉन जॉन नहीं है। –

उत्तर

76

DateTime एक मूल्य-प्रकार (struct) है, जहां-स्ट्रिंग एक संदर्भ-प्रकार (class आदि) है। यह महत्वपूर्ण अंतर है। एक संदर्भ हमेशा शून्य हो सकता है; एक मान नहीं हो सकता है (जब तक यह Nullable<T> - यानी DateTime? का उपयोग करता है), हालांकि इसे शून्य किया जा सकता है (DateTime.MinValue), जिसे अक्सर शून्य (एएसपी 1.1 में) के रूप में समझा जाता है।

+0

स्पष्टीकरण के लिए बहुत बहुत धन्यवाद। गैर-शून्य वर्गों को बनाने के लिए structs का उपयोग क्यों नहीं करें? –

+1

और डिफ़ॉल्ट (YourWrapper) क्या होगा? ;-p यह एक नल संदर्भ युक्त एक संरचना होगी ... सभी structs * हमेशा * एक डिफ़ॉल्ट कन्स्ट्रक्टर है ... –

+0

(या * कभी * एक डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है, इस पर निर्भर करता है कि आप सी # या सीएलआई के बारे में बात कर रहे हैं या नहीं - जो इस बिंदु से असहमत हैं) –

8

डेटटाइम एक संरचना है, न कि कक्षा। एक 'परिभाषा पर जाएं' या ऑब्जेक्ट ब्राउज़र में इसे देखने के लिए देखें।

एचटीएच!

1

डेटटाइम एक मान प्रकार है, जो एक int के समान है। केवल संदर्भ प्रकार (जैसे स्ट्रिंग या MyCustomObject) शून्य हो सकता है। संदर्भ प्रकार वास्तव में ढेर पर वस्तुओं के स्थान पर "संदर्भ" संग्रहीत करते हैं।

यहां एक article है जो मैंने पाया है कि यह बेहतर बताता है। और यहां MSDN article on it

+0

या नालीबल (जो स्वयं भी एक संरचना है) के माध्यम से शून्य मूल्य प्रकार –

0

स्ट्रिंग एक वर्ग है जबकि डेटटाइम एक संरचना है। Thats क्यों आप इसे

7

वैल्यू टाइप और संदर्भ प्रकारों के बीच महत्वपूर्ण अंतर यह है कि मान प्रकारों में इन "मान अर्थशास्त्र" हैं। डेटटाइम, इंट 32 और अन्य सभी मूल्य प्रकारों की कोई पहचान नहीं है, एक इंट 32 "42" अनिवार्य रूप से किसी भी अन्य इंट 32 से समान मूल्य के साथ अलग नहीं है।

सभी मूल्य प्रकार "ऑब्जेक्ट्स" या तो स्टैक पर या संदर्भ प्रकार ऑब्जेक्ट के हिस्से के रूप में मौजूद हैं। एक विशेष मामला यह है कि जब आप किसी ऑब्जेक्ट या इंटरफ़ेस में मान प्रकार का उदाहरण डालते हैं - इसे "मुक्केबाजी" कहा जाता है, और यह केवल एक डमी संदर्भ-प्रकार ऑब्जेक्ट बनाता है जिसमें केवल उस मान को शामिल किया जाता है जिसे वापस निकाला जा सकता है ("अनबॉक्सिंग") ।

दूसरी ओर, संदर्भ प्रकारों की पहचान है। एक "नया ऑब्जेक्ट()" किसी अन्य "ऑब्जेक्ट()" के बराबर नहीं है, क्योंकि वे जीसी ढेर पर अलग-अलग उदाहरण हैं। कुछ संदर्भ प्रकार बराबर विधि और अधिभारित ऑपरेटरों को प्रदान करते हैं ताकि वे अधिक मूल्यवान व्यवहार कर सकें, उदाहरण के लिए। एक स्ट्रिंग "एबीसी" अन्य "एबीसी" स्ट्रिंग के बराबर होती है भले ही वे वास्तव में दो अलग-अलग वस्तुएं हों।

तो जब आपके पास कोई संदर्भ हो, तो इसमें या तो वैध ऑब्जेक्ट का पता हो सकता है, या यह शून्य हो सकता है। जब मान प्रकार ऑब्जेक्ट्स शून्य-शून्य होते हैं, तो वे केवल शून्य होते हैं। उदाहरण के लिए। एक पूर्णांक शून्य, एक फ्लोट शून्य, बूलियन झूठी, या डेटटाइम। MinValue। यदि आपको "शून्य" और "मूल्य गुम/शून्य" के बीच अंतर करने की आवश्यकता है, तो आपको या तो एक अलग बूलियन ध्वज का उपयोग करने की आवश्यकता है, या बेहतर, अभी तक .NET 2.0 में Nullable < टी> कक्षा का उपयोग करें। जो बस मूल्य और एक बुलियन ध्वज है। सीएलआर में भी समर्थन है ताकि हस्वाल्लू के साथ एक नालीबल का मुक्केबाजी = झूठी नतीजे में झूठे नतीजे न हों, झूठ + शून्य के साथ एक बॉक्स वाली संरचना में नहीं, क्योंकि यह होगा कि आप इस संरचना को स्वयं लागू करना चाहते हैं।

1

मूल्य-प्रकार के लिए शून्य होने के लिए, कुछ मूल्य होना चाहिए जो कि कोई अन्य वैध अर्थ नहीं होगा, और जिसे सिस्टम किसी भी तरह से "शून्य" के रूप में जाना जाना चाहिए। कुछ मूल्य प्रकार बिना किसी अतिरिक्त संग्रहण की आवश्यकता के पहले मानदंड को पूरा कर सकते हैं। .net मन में नल मूल्यों की अवधारणा के साथ जमीन से डिजाइन किया गया था, यह था हो सकता था Object include a virtual IsLogicalNull property, and a non-virtual IsNull which would return सच if इस is null and, otherwise invoke its IsLogicalNull property and return the result. If .net had done this, it would have avoided the need for the quirky boxing behavior and struct constraint of Nullable (an empty Nullable could be boxed as an empty Nullable , and still be recognized as null`)।

समय यह .net 2.0 में नल मूल्य प्रकार के लिए समर्थन प्रदान करने के लिए, तथापि, कोड का एक बहुत कुछ लिखा गया था जो मान लिया है कि Guid और DateTime जैसी चीजों के लिए मूलभूत मूल्यों null के रूप में माना नहीं किया जाएगा निर्णय लिया गया हैं। चूंकि निरर्थक प्रकारों में से अधिकांश मूल्य उनके अनुमानित डिफ़ॉल्ट मान (यानी null) के साथ हैं, जिनके पास null मान था, लेकिन किसी अन्य चीज़ के लिए डिफ़ॉल्ट रूप से, मूल्य से अधिक भ्रम जोड़ दिया होता।