2010-07-06 18 views

उत्तर

19

जैसा कि अन्य ने कहा है, "?" इसे Nullable<T> में बदलने के लिए सिर्फ शॉर्टेंड है। यह एक अन्य मूल्य प्रकार है जो एक बूलियन ध्वज के साथ कहता है कि वास्तव में एक उपयोगी मूल्य है या नहीं, या यह प्रकार के लिए शून्य मान है या नहीं। वास्तविक कोड में

public struct Nullable<T> 
{ 
    private readonly bool hasValue; 
    public bool HasValue { get { return hasValue; } } 

    private readonly T value; 
    public T value 
    { 
     get 
     { 
      if (!hasValue) 
      { 
       throw new InvalidOperationException(); 
      } 
      return value; 
     } 
    } 

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

    // Calling new Nullable<int>() or whatever will use the 
    // implicit initialization which leaves value as default(T) 
    // and hasValue as false. 
} 

जाहिर है वहाँ अधिक तरीकों (जैसे GetValueOrDefault()) और रूपांतरण ऑपरेटरों आदि सी # संकलक ऑपरेटरों जो प्रभावी रूप से प्रॉक्सी उठाया मूल करने के लिए कहते हैं कर रहे हैं: दूसरे शब्दों में, Nullable<T> इस तरह एक सा लग रहा है T के लिए ऑपरेटरों।

टूटी हुई रिकॉर्ड की तरह लगने के जोखिम पर, यह अभी भी एक मूल्य प्रकार है। यह मुक्केबाजी नहीं शामिल है ... और आप लिखते हैं जब:

int? x = null; 

कि एक अशक्त संदर्भ नहीं है - यह Nullable<int> के शून्य मान है, यानि कि एक जहाँ hasValuefalse है।

जब एक नल प्रकार बॉक्सिंग है, CLR एक सुविधा है जिससे मान न तो कोई अशक्त संदर्भ के लिए बॉक्सिंग हो जाता है, या एक सादे टी बॉक्सिंग तो अगर आप इस तरह कोड है:

int? x = 5; 
int y = 5; 

object o1 = x; 
object o2 = y; 

o1 और o2 द्वारा निर्दिष्ट बॉक्स किए गए मान अलग-अलग हैं। आप यह नहीं बता सकते कि मुक्केबाजी का नतीजा एक नतीजा है। चीनी के लिए

+0

आपको बहुत बहुत धन्यवाद। –

5

? वाक्यविन्यास Nullable<T> संरचना के लिए वाक्य रचनात्मक चीनी है।

संक्षेप में, जब आप int? myNullableInt लिखते हैं, तो संकलक इसे Nullable<int> myNullableInt में बदल देता है।

MSDN से ("Nullable प्रकार अवलोकन" के लिए नीचे स्क्रॉल):

वाक्य रचना टी? Nullable के लिए shorthand है, जहां टी एक मूल्य प्रकार है। दो रूपों में अंतर-परिवर्तनीय हैं।

+2

+1, लेकिन मुझे नहीं लगता कि शब्द "ऑपरेटर" सही है। – Kobi

+0

@ कोबी - काफी मेला। उत्तर अपडेट किया गया। – Oded

+0

मैं तर्क दूंगा कि यह सिर्फ वाक्य रचनात्मक चीनी है, इसे देखें [उत्तर] (http://stackoverflow.com/a/24738380/1552016)। – qqbenq

-3

मूल शब्दों में, एक शून्य प्रकार सामान्य प्रकार का एक बॉक्स वाला संस्करण होता है जिसमें अतिरिक्त बूलियन फ़ील्ड होता है जिसे उस पर हैवल्यू कहा जाता है। जब यह फ़ील्ड गलत पर सेट है, तो उदाहरण शून्य है।

CLR कार्यान्वयन पर थोड़ा और विस्तार, और क्यों वे इसे चुना है हो सकता है के लिए इस उत्तर चेक आउट: Boxing/Unboxing Nullable Types - Why this implementation?

+0

नहीं, यह बिल्कुल एक बॉक्स संस्करण नहीं है। यह अभी भी एक मूल्य प्रकार है। –

+2

मैं इसे एक बॉक्सिंग संस्करण नहीं कहूंगा। बॉक्सिंग एक मान प्रकार का एक संदर्भ प्रकार प्रतिनिधित्व बनाता है। Nullable एक संरचना है। –

1

क्या यह एक Nullable प्रकार के हुआ करते थे प्रकार बदल जाता है।

यदि आप किसी पूर्णांक था, और यह एक पूर्णांक ?:

int myInt; 

बनाने का फैसला किया

और आप इसे बनाने:

int? myInt; 

यह अब है:

Nullable<int> myInt; 

में वास्तविकता।

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