जवाबों:
अब तक के अन्य उत्तर सभी सही हैं; मैं बस एक और जोड़ना चाहता हूं जो थोड़ा साफ हो:
v2 = v1 ?? default(int);
कोई भी Nullable<T>
इसके लिए परिवर्तनीय है T
, यह प्रमाणित है कि संपूर्ण अभिव्यक्ति का मूल्यांकन किया जा सकता है कभी भी एक वैल्यू टाइप के लिए एक अशक्त असाइनमेंट में परिणाम नहीं हो सकता है। अतः, अशक्त-संचालक ऑपरेटर ??
टर्नरी ऑपरेटर के लिए सिंटेक्स चीनी है:
v2 = v1 == null ? default(int) : v1;
... जो बदले में अगर / के लिए सिंटैक्स चीनी है:
if(v1==null)
v2 = default(int);
else
v2 = v1;
.NET 4.0 के रूप में, Nullable<T>
एक "GetValueOrDefault ()" विधि है, जो एक अशक्त-सुरक्षित गेट्टर है जो मूल रूप से ऊपर दिखाए गए अशक्त-सह-प्रदर्शन करता है, इसलिए यह भी काम करता है:
v2 = v1.GetValueOrDefault();
default(int)
वाकई जरूरत है? एक साधारण के साथ क्या गलत है 0
?
default
जहां उपयुक्त हो उसका उपयोग करने की सिफारिश की जाती है । शून्य हमेशा एक मूल्य के रूप में मान्य नहीं होता है, बहुत कम डिफ़ॉल्ट होता है, इसलिए यदि आप int
एक सामान्य के साथ प्रतिस्थापित करते हैं तो आपको T
मेरा कोड काम मिलेगा जबकि शून्य नहीं। कुछ भविष्य के फ्रेमवर्क संस्करण में, default
अधिभार भी हो सकता है; यदि और ऐसा होता है, तो डिफ़ॉल्ट का उपयोग करने वाला कोड आसानी से लाभ ले सकेगा, जबकि स्पष्ट अशक्त या शून्य असाइनमेंट को बदलना होगा।
ऐशे ही,
if(v1.HasValue)
v2=v1.Value
आप असाइनमेंट के लिए मान गुण का उपयोग कर सकते हैं।
v2 = v1.Value;
v1.HasValue
पहले जांचना सुनिश्चित करें ।
यदि आप जानते हैं कि v1
एक मूल्य है, तो आप Value
संपत्ति का उपयोग कर सकते हैं:
v2 = v1.Value;
GetValueOrDefault
यदि कोई एक है, तो विधि का उपयोग करना , अन्यथा प्रकार के लिए डिफ़ॉल्ट, या आपके द्वारा निर्दिष्ट डिफ़ॉल्ट मान निर्दिष्ट करेगा:
v2 = v1.GetValueOrDefault(); // assigns zero if v1 has no value
v2 = v1.GetValueOrDefault(-1); // assigns -1 if v1 has no value
HasValue
यदि v1
मान हो, तो आप संपत्ति का उपयोग कर सकते हैं :
if (v1.HasValue) {
v2 = v1.Value;
}
GetValueOrDefault(T)
विधि के लिए भाषा समर्थन भी है :
v2 = v1 ?? -1;
यदि v1 शून्य है, तो आप ऐसा नहीं कर सकते, लेकिन आप ऑपरेटर से जांच कर सकते हैं।
v2 = v1 ?? 0;
GetValueOrDefault()
वस्तु का मूल्य पुनः प्राप्त करता है। यदि यह शून्य है, तो यह int का डिफ़ॉल्ट मान लौटाता है, जो कि 0 है।
उदाहरण:
v2= v1.GetValueOrDefault();
यदि किसी दिए गए प्रकार के लिए डिफ़ॉल्ट मान स्वीकार्य परिणाम है:
if (v1.HasValue)
v2 = v1.GetValueOrDefault();
यदि आप परिणाम के अपरिभाषित होने पर एक अलग डिफ़ॉल्ट मान चाहते हैं:
v2 = v1.GetValueOrDefault(255); // or any valid value for int in place of 255
यदि आप केवल मूल्य वापस चाहते हैं (भले ही विधि विफल हो या न हो):
v2 = v1.GetValueOrDefault();
.NET 4.7.2 .: GetValueOrDefault()
बिना किसी जाँच के फ़ील्ड मान लौटाता है।
जहां तक मेरा सवाल है सबसे अच्छा समाधान GetValueOrDefault()
विधि का उपयोग कर रहा है।
v2 = v1.GetValueOrDefault();
इंट रूपांतरण के लिए अशक्त ऐसा किया जा सकता है:
v2=(int)v1;
यह संभव है v2 = Convert.ToInt32(v1);
तुम यह कर सकते थे
v2 = v1.HasValue ? v1.Value : v2;
के बीच एक साधारण रूपांतरण v1
और v2
क्योंकि संभव नहीं है v1
की तुलना में मूल्यों का एक बड़ा डोमेन है v2
। यह सब कुछ है v1
जो null
राज्य को जोड़ सकता है। यह स्पष्ट करने के लिए कि राज्य int
का नक्शा बनाने के लिए किस मूल्य का उपयोग किया जाएगा null
। ऐसा करने का सबसे सरल तरीका ??
ऑपरेटर है
v2 = v1 ?? 0; // maps null of v1 to 0
यह लंबे रूप में भी किया जा सकता है
int v2;
if (v1.HasValue) {
v2 = v1.Value;
} else {
v2 = 0;
}
आपके उपयोग के संदर्भ के आधार पर, आप C # 7 के पैटर्न-मिलान सुविधा का उपयोग कर सकते हैं:
int? v1 = 100;
if (v1 is int v2)
{
Console.WriteLine($"I'm not nullable anymore: {v2}");
}
चूँकि कुछ लोग स्पष्टीकरण को छोड़ने के बिना नीचा दिखा रहे हैं, इसलिए मैं व्यवहार्य समाधान के रूप में इसके लिए औचित्य को समझाने के लिए कुछ विवरण जोड़ना चाहूंगा।
सी # 7 का पैटर्न मिलान अब हमें एक मूल्य के प्रकार की जांच करने और इसे संक्षेप में डालने की अनुमति देता है। उपरोक्त स्निपेट में, if-condition केवल तभी पास होगी जब इसमें संग्रहित मूल्य v1
प्रकार के लिए अनुकूल हो v2
, जिसके लिए यह मामला है int
। यह निम्नानुसार है कि जब मान के लिए v1
है null
, अगर-स्थिति विफल हो जाएगी क्योंकि अशक्त को नहीं सौंपा जा सकता है int
। अधिक ठीक से, null
एक नहीं है int
।
मैं यह बताना चाहता हूं कि यह समाधान हमेशा इष्टतम विकल्प नहीं हो सकता है। जैसा कि मैं सुझाव देता हूं, मेरा मानना है कि यह डेवलपर के सटीक उपयोग के संदर्भ पर निर्भर करेगा। यदि आपके पास पहले से ही एक है int?
और सशर्त रूप से उसके मूल्य पर काम करना चाहता है अगर-और-ही-अगर निर्दिष्ट मूल्य शून्य नहीं है (यह एकमात्र समय है जब बिना जानकारी खोए एक अशक्त इंट को नियमित रूप से इंट में बदलना सुरक्षित है), तो पैटर्न मिलान शायद ऐसा करने के सबसे संक्षिप्त तरीकों में से एक है।
HasValue
चेक को गलती से दूर करने का कोई जोखिम नहीं है ।
C # 7.1 और बाद में, ऑपरेटर के बजाय default
शाब्दिक का उपयोग करके टाइप किया जा सकता है, इसलिए इसे नीचे लिखा जा सकता है:default
v2 = v1 ?? default;
int v2= Int32.Parse(v1.ToString());
v1
हैnull
?