2011-06-17 19 views
12

संभव डुप्लिकेट:
What's the difference between 'int?' and 'int' in C#?int का स्पष्टीकरण? बनाम पूर्णांक

मैं सी # में कुछ कोड है कि के रूप में एक चर वाणी का सामना करना पड़ा: int? number

क्या ? मतलब है और कैसे करता है यह सिर्फ भिन्न है: int

उत्तर

16

intnull नहीं हो सकता है।

int?Nullable<int> संरचना के लिए एक उपनाम है, जिसे आप null पर सेट कर सकते हैं।

+7

ध्यान दें कि 'int?' * * * एक मान प्रकार है ... जो आपके पहले वाक्य की "परिभाषा" के विपरीत है ... –

+0

मैं अभी भी आपकी पहली वाक्य से असहमत हूं, 'int?' एक मान प्रकार है एक शून्य मूल्य के साथ। फिर आप एक "ऑब्जेक्ट" के बारे में बात करते हैं - जबकि एक * ऑब्जेक्ट * कभी शून्य नहीं होता है, केवल एक संदर्भ है ... और एक मान प्रकार मान किसी वस्तु को वैसे भी नहीं है। –

+0

आप int सेट नहीं कर सकते हैं? शून्य करने के लिए, लेकिन आप इसे शून्य कर सकते हैं :) –

4

यह वाक्य रचनात्मक है Nullable<int>

मूल रूप से आपकी संख्या (या कोई अन्य मूल्य प्रकार) शून्य के साथ-साथ यह मूल्य भी हो सकता है। आप HasValue प्रॉपर्टी का उपयोग करके एक मूल्य की जांच करते हैं। उन्हें उनके मूल्य प्रकारों में डाला जा सकता है (हालांकि यह शून्य होने पर असफल हो जाएगा) या आप वैल्यू प्रॉपर्टी का उपयोग कर सकते हैं (फिर यह शून्य होने पर अपवाद फेंक देगा)

एक चीज जो आमतौर पर अनदेखा प्रतीत होती है जब निरर्थक प्रकारों का उपयोग करना GetValueOrDefault() विधि है जो ऑब्जेक्ट शून्य है तो डिफ़ॉल्ट (टी) देता है।

जैसा कि @ केली ट्रूममैन टिप्पणी में बताते हैं कि आप वास्तव में हैस्वालू की जांच के बजाय इसे शून्य से तुलना कर सकते हैं। यह प्रकार ओवरराइडन समानता विधियों के साथ एक मान प्रकार है ताकि जितना अधिक न हो, उतना ही शून्य हो सकता है जब शून्य के मुकाबले यह मूल्य न हो।

+0

तुम भी सामान्य 'मूल्य का उपयोग कर सकते == null' बजाय' HasValue' की जाँच करें। –

3

घोषणा के पीछे एक प्रश्नचिह्न का अर्थ है कि परिवर्तनीय शून्य है।

5

int?Nullable<int> के लिए शॉर्टेंड है जो आपको यह दिखाने का मौका देता है कि एक पूर्णांक नल को संभाल सकता है।

int? foo = null; 

यह है जहाँ आप पहले से अतीत में एक जादू मूल्य (-1) का इस्तेमाल किया है | मूल्य की कमी का संकेत है के लिए उपयोगी है, और यह भी उपयोगी होता है जब डेटाबेस स्तंभों है कि रिक्त प्रविष्टियों को अनुमति के साथ काम कर।

एक अर्ध में गहराई से देखने के लिए, Nullable<T> (में शुरू की गई .NET 2.0) बस एक मान प्रकार T कि दो गुण, HasValue और Value को उजागर करता है, जहां HasValue एक बूलियन कि मूल्य अगर इंगित करता है पर एक आवरण है सेट किया गया है और Value (स्पष्ट रूप से पर्याप्त) मान देता है। Value तक पहुंचने में त्रुटि है यदि HasValue गलत है। इसलिए, Value तक पहुंचने के लिए, यह HasValue पहले जांचने के लिए अच्छा फॉर्म है। इसके अतिरिक्त, यदि आप किसी भी गैर-मान को डिफ़ॉल्ट मानों (संख्यात्मक प्रकारों के लिए 0) पर सामान्यीकृत करना चाहते हैं, तो आप HasValue को जांचने के बिना विधि GetValueOrDefault() विधि का उपयोग कर सकते हैं।

ध्यान दें कि यद्यपि आप null को foo स्थापित करने के लिए दिखाई देते हैं, यह सामान्य उपयोग के परिदृश्यों के तहत नहीं वास्तव में अशक्त है। null इस प्रकार के लिए बस अतिरिक्त वाक्य रचनात्मक चीनी है।कोड के ऊपर लाइन इस फैशन में चर शुरु कर रहा है बस गलत पर HasValue संपत्ति सेट

Nullable<int> foo = new Nullable<int>(); 

करने के लिए अनुवाद।

हालांकि, मुक्केबाजी से जुड़े परिस्थितियों में, मूल्य वास्तव में शून्य हो जाएगा यदि HasValue गलत है (यह अन्यथा T पर बॉक्स होगा)। परिणामों से अवगत रहें! उदाहरण के लिए, में:

int? foo = null; 
string bar = foo.ToString(); // this is fine, returns string.Empty 
Type type = foo.GetType(); // blows up! GetType causes the value to box 
          // resulting in a NullReferenceException 

यह एक त्वरित क्रैश कोर्स है। अधिक जानकारी के लिए, documentation पर जाएं।

10

int? सामान्य System.Nullable<T> संरचना प्रकार का एक उदाहरण बनाने के लिए एक आशुलिपि है। यह आपको अपने चर को कम करने योग्य बनाता है। याद रखें, यह देखते हुए कि <ValueType>? वाक्य रचना एक आशुलिपि है, तो आप अपने चर इस प्रकार की घोषणा कर सकता है:

Nullable<int> i = 10; 
संबंधित मुद्दे