अशक्त प्रकार "int?" का डिफ़ॉल्ट मान क्या है (प्रश्न चिह्न सहित)?


102

C # में, श्रेणी उदाहरण चर का डिफ़ॉल्ट मान क्या है int??

उदाहरण के लिए, निम्नलिखित कोड में, क्या मूल्य होगा MyNullableIntअगर यह स्पष्ट रूप से निर्दिष्ट नहीं किया गया है?

class MyClass
{
    public int? MyNullableInt;
}

(यह संभावना है कि इस सवाल का जवाब लगभग निश्चित रूप से या तो है nullया 0है, लेकिन उनमें से कौन-यह क्या है?)


9
क्यों होता है पतन? (वास्तव में व्यवहार का परीक्षण करने के लिए कोड चलाने के बिना इस प्रश्न का उत्तर मेरे लिए स्पष्ट रूप से स्पष्ट नहीं था; और आश्चर्यजनक रूप से, मैं स्टैकऑवरफ़्लो पर इस प्रश्न का एक डुप्लिकेट नहीं पा सका, या आसानी से Google के माध्यम से अन्यत्र खोजा जा सकता है।)
जॉन श्नाइडर

1
आप यहाँ देख सकते हैं - मेरे लिए पहला गूगल हिट।
500 - आंतरिक सर्वर त्रुटि

2
@ 500 - जब मैं शोध कर रहा था तो मुझे वह लेख मिला - मैं वास्तव में नीचे दिए गए अपने उत्तर में इससे जुड़ा था - लेकिन जहां तक ​​मैं बता सकता हूं, लेख में स्पष्ट रूप से उल्लेख नहीं किया गया है कि एक अशक्त प्रकार का डिफ़ॉल्ट मान शून्य है। यह है कहते हैं कि "HasValue के लिए डिफ़ॉल्ट मान असत्य है। The मूल्य संपत्ति कोई डिफ़ॉल्ट मान है", लेकिन वह सीधे कुछ अतिरिक्त खुदाई के बिना अपने मूल सवाल का जवाब नहीं है।
जॉन श्नाइडर

2
मुझे आश्चर्य है कि यह इसलिए था क्योंकि आप सिर्फ एक ब्रेकपॉइंट सेट कर सकते हैं और देख सकते हैं कि मूल्य क्या है, या तत्काल विंडो प्रकार में int? x;और देखें कि परिणाम क्या है?
रुफस एल

जवाबों:


136

int?"प्रकार" का उपयोग करने वाले किसी भी अशक्त प्रकार के लिए - और के लिए डिफ़ॉल्ट मान ? घोषणा - है null

यह मामला क्यों है:

  • int?Nullable <T> (जहां T है int), एक संरचना के प्रकार के लिए सिंथेटिक चीनी है । ( संदर्भ )
  • Nullable<T>प्रकार एक है bool HasValue सदस्य है, जो जब false, बनाता है Nullable<T>एक उदाहरण "की तरह कार्य" nullमूल्य। विशेष रूप से, Nullable <टी> .Equals विधि वापस जाने के लिए ओवरराइड की गई है trueजब एक Nullable<T>साथ HasValue == falseएक वास्तविक से की जाती है nullमूल्य।
  • से सी # भाषा विशिष्टता 11.3.4 , एक struct उदाहरण के प्रारंभिक डिफ़ॉल्ट मान है कि struct के मान प्रकार खेतों उनके डिफ़ॉल्ट मान पर सेट के सभी, और कहा कि struct के संदर्भ प्रकार क्षेत्रों के लिए सेट के सभी है null
  • boolC # में एक चर का डिफ़ॉल्ट मान false ( संदर्भ ) है। इसलिए, HasValueएक डिफ़ॉल्ट Nullable<T>उदाहरण की संपत्ति है false; जो बदले में उस Nullable<T>उदाहरण की तरह ही कार्य करता है null

जब मैं से एक घोषणा को बदलने int? x = null;के लिए int? x;, मैं संकलक त्रुटियों मिल आगे कोड में नीचे: "अ-निरुपित स्थानीय चर x का प्रयोग करें"।
जॉन पिक

1
@JohnPick यह एक C # संकलक सुविधा है जो बग को रोकने के लिए है जो आपके उपयोग से पहले एक चर को इनिशियलाइज़ करने के लिए "भूलने" से उत्पन्न हो सकता है। एक ऐसी स्थिति जहां आप एक असंगठित int का सामना कर सकते हैं ? जब यह एक वर्ग के सदस्य चर है। दोनों के उदाहरण यहां दिए गए हैं: blogs.msdn.microsoft.com/abhinaba/2005/11/08/…
जॉन श्नाइडर

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

4
@JonSchneider मेला काफी, मेरा बुरा तब
GôTô

वीएस के संकलक संकेत / चेतावनी भ्रामक है Field 'id' is never assigned to, and will always have its default value 0:। अजीब है ना?
हेंडी इरावन

32

मुझे उस Nullable<T>.GetValueOrDefault()विधि को साझा करना महत्वपूर्ण लगा जो विशेष रूप से गणित की संगणना के साथ काम करते समय काम आती है जो Nullable<int>उर्फ int?मूल्यों का उपयोग करती है। कई बार ऐसा होता है जब आपको HasValueसंपत्ति की जांच नहीं करनी पड़ती है और आप GetValueOrDefault()इसके बजाय बस उपयोग कर सकते हैं ।

var defaultValueOfNullableInt = default(int?);
Console.WriteLine("defaultValueOfNullableInt == {0}", (defaultValueOfNullableInt == null) ? "null" : defaultValueOfNullableInt.ToString());

var defaultValueOfInt = default(int);
Console.WriteLine("defaultValueOfInt == {0}", defaultValueOfInt);

Console.WriteLine("defaultValueOfNullableInt.GetValueOrDefault == {0}", defaultValueOfNullableInt.GetValueOrDefault());

कमांड लाइन काम करने के ऊपर कोड दिखाती है


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.