एक प्रकार के बाद प्रश्न चिह्न का उद्देश्य क्या है (उदाहरण के लिए: int? MyVariable)?


433

आमतौर पर प्रश्न चिह्न का मुख्य उपयोग करते हैं, सशर्त के लिए है x ? "yes" : "no"

लेकिन मैंने इसके लिए एक और उपयोग देखा है, लेकिन ?उदाहरण के लिए, ऑपरेटर के इस उपयोग का स्पष्टीकरण नहीं पा सकता है ।

public int? myProperty
{
   get;
   set;
}

जवाबों:


437

इसका अर्थ है कि प्रश्न में मूल्य प्रकार एक अशक्त प्रकार है

अशक्त प्रकार System.Nullable संरचना के उदाहरण हैं। एक अशक्त प्रकार अपने अंतर्निहित मूल्य प्रकार, और एक अतिरिक्त शून्य मान के लिए मूल्यों की सही सीमा का प्रतिनिधित्व कर सकता है। उदाहरण के लिए, एक Nullable<Int32>, "Int32 के Nullable" का उच्चारण, -2147483648 से 2147483647 तक किसी भी मूल्य को सौंपा जा सकता है, या इसे शून्य मान सौंपा जा सकता है। A Nullable<bool>को सही, गलत या अशक्त मान सौंपा जा सकता है। जब आप डेटाबेस और अन्य डेटा प्रकारों के साथ काम कर रहे होते हैं, तो ऐसे न्यूमेरिक और बूलियन प्रकारों को अशक्त करने की क्षमता विशेष रूप से उपयोगी होती है जिसमें ऐसे तत्व होते हैं जिन्हें मान नहीं सौंपा जा सकता है। उदाहरण के लिए, एक डेटाबेस में एक बूलियन क्षेत्र मूल्यों को सही या गलत संग्रहीत कर सकता है, या यह अपरिभाषित हो सकता है।

class NullableExample
{
  static void Main()
  {
      int? num = null;

      // Is the HasValue property true?
      if (num.HasValue)
      {
          System.Console.WriteLine("num = " + num.Value);
      }
      else
      {
          System.Console.WriteLine("num = Null");
      }

      // y is set to zero
      int y = num.GetValueOrDefault();

      // num.Value throws an InvalidOperationException if num.HasValue is false
      try
      {
          y = num.Value;
      }
      catch (System.InvalidOperationException e)
      {
          System.Console.WriteLine(e.Message);
      }
  }
}

3
संरचना के लिए उपयोग किया जाता है। यह मत सोचो कि यह वास्तव में कक्षाओं के लिए उपयोगी है।
MonsieurDart

8
@MonsieurDart - यही कारण है कि उत्तर "मूल्य प्रकार" कहते हैं
शॉन

3
@AntoineDahan - मान प्रकार में अशक्त प्रकार नहीं होते हैं क्योंकि वे परिभाषा से अशक्त होते हैं। मुझे लगता है कि आप जावा के बारे में सोच रहे हैं जहां एक intप्रकार और एक संबंधित Integerवर्ग है, उदाहरण के लिए।
शॉन

2
अधिक हाल ही में (2015) यहाँ
डायनासोर 21


118

यह एक आशुलिपि है Nullable<int>Nullable<T>का उपयोग एक मान प्रकार को सेट करने की अनुमति देने के लिए किया जाता है null। मूल्य प्रकार आमतौर पर शून्य नहीं हो सकते


3
शॉर्टहैंड शब्द का उपयोग करने के लिए प्लस एक, बहुत सीधे आगे!
हरि

3
दूसरा वाक्य मुझे भ्रमित करता है। "नहीं" से आपका क्या मतलब है? संकलक स्तर पर या आवेदन के संदर्भ में।
problemofficer

5
@problemofficer प्रति परिभाषा, value typesशून्य नहीं हो सकता। यदि आप विशेष रूप से एक मूल्य निर्दिष्ट किए बिना एक इंट या बूल (जो मूल्य प्रकार हैं) घोषित करते हैं, तो उनके पास अभी भी मूल्य (0 और गलत, क्रमशः) होंगे, अर्थात। वे अशक्त नहीं होंगे। सौंपे नहीं गए reference types, इस तरह के वस्तु या MyClass के रूप में, दूसरे हाथ पर, अशक्त हो जाएगा। आप मूल्य प्रकार और संदर्भ प्रकारों के बीच अंतर पर पढ़ना चाह सकते हैं।
क्लाउस बाइसकोव पेडरसन

विवरण के लिए आपका धन्यवाद। मैं अब समझता हूँ।
समस्याग्रस्त

62

में

x ? "yes" : "no"

? अगर एक वाक्य की घोषणा करता है । यहाँ: एक्स बूलियन स्थिति का प्रतिनिधित्व करता है; पहले भाग : है तो सजा और भाग के बाद है बाकी की सजा।

उदाहरण के लिए,

int?

? एक अशक्त प्रकार घोषित करता है, और इसका अर्थ है कि इसके पहले का प्रकार अशक्त मान हो सकता है।


9
मैं 'के बीच कोई संबंध नहीं देखता? एक अशक्त-सक्षम प्रकार और एक टर्नरी अभिव्यक्ति की घोषणा करना। अपने जवाब को वोट दें सर।
गूस क्रॉफोर्ड

36
मैं गस की उपरोक्त टिप्पणी से असहमत हूं। प्रश्न दिखाता है कि टर्नरी अभिव्यक्ति के साथ एक संभावित भ्रम है। यह उत्तर इस समस्या को हल करता है।
मारियो लेवेस्क

आप इस तरह की अशक्त तुलना का उपयोग कहां करेंगे? रिटर्न के अंदर इसकी अनुमति नहीं दी गई है। return value ? value : "isNull";मुझे बताता है कि यह string valueबूल में परिवर्तनीय नहीं है।
C4d

मुझे कहना होगा कि यह एक बहुत ही जटिल उत्तर है, खासकर जब इस सवाल पर दूसरों की तुलना में .. -1
फास्टट्रैक

यह स्वीकृत उत्तर होना चाहिए। चूंकि यह स्पष्ट और सटीक है। +1
JP Dolocanog

49

अशक्त प्रकार

अशक्त प्रकार System.Nullable संरचना के उदाहरण हैं। एक अशक्त प्रकार अपने अंतर्निहित मूल्य प्रकार, और एक अतिरिक्त अशक्त मूल्य के लिए मूल्यों की सामान्य सीमा का प्रतिनिधित्व कर सकता है । उदाहरण के लिए, एक [ Nullable<Int32>], जिसका उच्चारण "Nullable of Int32," को -2147483648 से 2147483647 तक किसी भी मूल्य को सौंपा जा सकता है, या इसे शून्य मान सौंपा जा सकता है। A [ Nullable<bool>] को सही या गलत या शून्य मान दिया जा सकता है। डेटाबेस और अन्य डेटा प्रकार के तत्वों से निपटने के लिए विशेष रूप से उपयोगी है जो कि एक मान निर्दिष्ट नहीं किया जा सकता है। उदाहरण के लिए, एक डेटाबेस में एक बूलियन क्षेत्र मूल्यों को सही या गलत संग्रहीत कर सकता है, या यह अपरिभाषित हो सकता है।


11

यह घोषणा करता है कि प्रकार अशक्त है।


2
आपकी पहली प्रविष्टि का कोई मतलब नहीं है, पूछने वाले का नमूना।
बाइनरी वॉरियर

रेटिंग के बारे में उत्सुक जब सभी ऊपर गहराई से जवाब देते हैं :)
नागा

6

व्यावहारिक उपयोग:

public string someFunctionThatMayBeCalledWithNullAndReturnsString(int? value)
{
  if (value == null)
  {
    return "bad value";
  }

  return someFunctionThatHandlesIntAndReturnsString(value);
}

1
जबकि ओपी अभी भी सक्रिय है, प्रश्न पूछने के 5 साल बाद, उत्तर अब प्रासंगिक नहीं हो सकता है।
स्ट्रॉबेरी

10
मेरे लिए यह 3 घंटे पहले था :-)
AJBauer

3

ऊपर दिए गए उत्तरों को जोड़ने के लिए, यहां एक कोड नमूना है

struct Test
{
    int something;
}
struct NullableTest
{
    int something;
}
class Example
{
    public void Demo()
    {
        Test t = new Test();
        t = null;

        NullableTest? t2 = new NullableTest();
        t2 = null;
    }
}

यह एक संकलन त्रुटि देगा:

त्रुटि 12 शून्य को 'टेस्ट' में नहीं बदल सकती क्योंकि यह एक गैर-अशक्त मान प्रकार है

ध्यान दें कि NullableTest के लिए कोई संकलन त्रुटि नहीं है। (ध्यान दें? टी 2 की घोषणा में)


2

int?के लिए आशुलिपि है Nullable<int>। दो रूप विनिमेय हैं।

Nullable<T>एक ऑपरेटर है जिसे आप Tइसे स्वीकार करने के लिए एक मूल्य प्रकार के साथ उपयोग कर सकते हैंnull

आप यह पता नहीं है मामले में: मूल्य प्रकार प्रकार है कि के रूप में मान स्वीकार कर रहे हैं int, bool,char आदि ...

वे मानों के संदर्भों को स्वीकार नहीं कर सकते हैं: यदि आप उन्हें संदर्भ प्रकारों केnull विपरीत असाइन करते हैं , तो वे एक संकलन-समय त्रुटि उत्पन्न करेंगे , जो स्पष्ट रूप से इसे स्वीकार कर सकते हैं।

आपको इसकी आवश्यकता क्यों होगी? क्योंकि कभी-कभी आपके वैल्यू टाइप वैरिएबल से कुछ ऐसे रिटर्न दिए जा सकते हैं, जो किसी डेटाबेस द्वारा लौटाए गए लापता या अपरिभाषित वेरिएबल की तरह बहुत अच्छे से काम नहीं करते।

मैं आपको Microsoft दस्तावेज़ीकरण पढ़ने का सुझाव देता हूं क्योंकि यह विषय को काफी अच्छी तरह से कवर करता है।

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