2009-07-04 18 views

उत्तर

20

कई कारण:

  • इतिहास: Nullable<T> तक .NET 2.0 मौजूद नहीं था, और यह मौजूदा कोड को तोड़ने नहीं कर सकते हैं - विशेष रूप से के लिए Nullable<T>
  • अर्थ अलग मुक्केबाजी नियमों के साथ: अगर मैं चाहता हूँ एक int, मैं नहीं चाहते हो सकता है यह व्यर्थ होने के लिए ... मैं इसे एक int होना चाहता हूँ, और मैं चेक-के लिए करने के लिए/संभाल nulls
  • अंतरिक्ष के लिए नहीं करना चाहती: यह प्रत्येक के लिए अतिरिक्त लागत कहते हैं संरचना ... विशेष रूप से, कल्पना एक byte[] ine, और अब विचार करें कि byte शून्य था - अतिरिक्त ओवरहेड के बहुत सारे; * प्लस यह आप Blits कर बंद कर देंगे आदि *
  • प्रदर्शन: Nullable<T> अतिरिक्त दंड के बहुत सारे कहते हैं, विशेष रूप से बहुत से छिपे हुए कॉल .HasValue और .Value/.GetValueOrDefault(); इस विशेष रूप से "उठा लिया ऑपरेटरों" में दिखाया गया है - यानी x + y नीचे की तरह कुछ है, जो तंग छोरों आदि के लिए कहते हैं हो जाता है:

    (x.HasValue && y.HasValue) ? (x.GetValueOrDefault() + y.GetValueOrDefault()) : null

इसी तरह, x == y जाँच करने के लिए है:

  • अगर दोनों अशक्त => true
  • अगर एक अशक्त => झूठी
  • अन्यथाका उपयोग 10 प्रत्येक

बहुत सारी भूमि के ऊपर की की GetValueOrDefault() पर ....

+0

अतिरिक्त के बारे में मत भूलना ?? ऑपरेटर वे भी साथ फेंक दिया। int i = j ?? k; // अगर जे शून्य है, तो के उपयोग करें। –

+0

अच्छी तरह से, यह 'Nullable ' के लिए विशिष्ट नहीं है - लेकिन एक और अच्छा बिंदु –

+0

@ क्रिस क्या यह काम करता है? जे शून्य नहीं हो सकता है, अन्यथा आप इसे किसी मान प्रकार पर असाइन नहीं कर सकते हैं, है ना? ;-) –

1

कौन सा मूल्य प्रकार वास्तव में शून्य है? मैं किसी के बारे में नहीं जानता।

संपादित करें: यदि आप स्ट्रिंग प्रकार का संदर्भ लेते हैं, तो यह मान प्रकार नहीं है, लेकिन एक संदर्भ प्रकार है।

+0

आपको उन्हें Nullable टाइप – philsquared

+1

में लपेटने की आवश्यकता है लेकिन यह कुछ अलग है। मेरा मानना ​​है कि विषय स्टार्टर का मतलब बॉक्स के बाहर मूल्य प्रकारों को कम करने योग्य था, शायद स्ट्रिंग प्रकार का जिक्र है। – User

+1

मुझे लगता है कि ओपी का मतलब कुछ है "अगर मूल्य प्रकारों को निरर्थक बनाया जा सकता है, तो वे सभी शुरुआत से क्यों नहीं निकलते हैं?"। – Guffa

6

हां, एक जुर्माना है। Nullable<T> संरचना में मूल्य और एक बुलियन ध्वज भी शामिल है जो मूल्य की शून्यता निर्धारित करता है।

हालांकि बुलियन केवल एक बाइट है, संरचनाएं भी शब्द सीमाओं के साथ गठबंधन हैं। एक int स्मृति के चार बाइट्स का उपयोग करता है, लेकिन int? को आठ बाइट की आवश्यकता होती है।

+0

जुर्माना एक अतिरिक्त शब्द से भी बदतर है। नालीबल संरचना का डिज़ाइन का मतलब है कि 'न्यूबल योग्य ' बनाने के लिए कम से कम एक अतिरिक्त "कॉपी टी" ऑपरेशन की आवश्यकता होगी, और कोई भी कोड जो 'Nullable ' प्राप्त करता है उसे कम से कम एक अतिरिक्त "कॉपी टी" ऑपरेशन करना होगा इसका उपयोग करने के लिए आदेश। – supercat

0

मार्क Gravell जवाब के अलावा, Nullable < टी > से परिलक्षित कोड की जाँच करें:

public struct Nullable&lt;T&gt; where T: struct 
{ 
    private bool hasValue; 

    internal T value; 

    public Nullable(T value) 
    { 
     this.value = value; 
     this.hasValue = true; 
    } 

    public bool HasValue 
    { 
     get 
     { 
      return this.hasValue; 
     } 
    } 
    public T Value 
    { 
     get 
     { 
      if (!this.HasValue) 
      { 
       ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_NoValue); 
      } 
      return this.value; 
     } 
    } 
    public T GetValueOrDefault() 
    { 
     return this.value; 
    } 

    public T GetValueOrDefault(T defaultValue) 
    { 
     if (!this.HasValue) 
     { 
      return defaultValue; 
     } 
     return this.value; 
    } 

    public override bool Equals(object other) 
    { 
     if (!this.HasValue) 
     { 
      return (other == null); 
     } 
     if (other == null) 
     { 
      return false; 
     } 
     return this.value.Equals(other); 
    } 

    public override int GetHashCode() 
    { 
     if (!this.HasValue) 
     { 
      return 0; 
     } 
     return this.value.GetHashCode(); 
    } 

    public override string ToString() 
    { 
     if (!this.HasValue) 
     { 
      return ""; 
     } 
     return this.value.ToString(); 
    } 

    public static implicit operator T?(T value) 
    { 
     return new T?(value); 
    } 

    public static explicit operator T(T? value) 
    { 
     return value.Value; 
    } 
} 

आप ' बूलियन HasValue के अस्तित्व और गुणों का उपयोग कैसे करेंगे।

0

कार्यान्वयन पर विचार करें।का विरोध करने के संदर्भ जो स्मृति के संकेत दिए गए हैं वस्तुओं के रूप में सी # में एक पूर्णांक, के रूप में

public struct Int32 : IComparable, IFormattable, IConvertible, IComparable<int>, IEquatable<int> 

एक struct ढेर पर सीधे संग्रहीत किया जाता है परिभाषित किया गया है (संदर्भ में ही ढेर में है, लेकिन आवंटन ढेर में है) ।

एक पूर्ण संदर्भ का मतलब है कि ढेर में सूचक को ढेर में किसी स्थान पर प्रारंभ नहीं किया गया है।

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