एक शर्त अभिव्यक्ति में अशक्त बूल की जांच करने का सबसे अच्छा तरीका (यदि ...)


207

मैं सोच रहा था कि अशक्त बूलों पर स्थिति जांच करने के लिए सबसे साफ और समझने योग्य वाक्य रचना क्या थी।

निम्नलिखित अच्छी या बुरी कोडिंग शैली है? क्या हालत को बेहतर / अधिक सफाई से व्यक्त करने का कोई तरीका है?

bool? nullableBool = true;
if (nullableBool ?? false) { ... }
else { ... }

विशेष रूप से अगर (nullableBool ?? false) भाग। मुझे if (x.HasValue && x.Value)शैली पसंद नहीं है ...

(निश्चित नहीं है कि प्रश्न पहले पूछा गया है ... खोज के साथ कुछ समान नहीं मिल सका)

जवाबों:


361

मुझे लगता है कि बहुत से लोग इस तथ्य पर ध्यान केंद्रित करते हैं कि यह मान अशक्त है, और इस बारे में मत सोचो कि वे वास्तव में क्या चाहते हैं :)

bool? nullableBool = true;
if (nullableBool == true) { ... } // true
else { ... } // false or null

या यदि आप अधिक विकल्प चाहते हैं ...

bool? nullableBool = true;
if (nullableBool == true) { ... } // true
else if (nullableBool == false) { ... } // false
else { ... } // null

(nullableBool == true)सच कभी नहीं लौटेंगे अगर बूल? is null: पी


2
मुझे महसूस नहीं हुआ कि अशक्त तुलना इस तरह सार्थक थी। विवरण msdn.microsoft.com/en-us/library/2cf62fcy.aspx
Micah Zoltu

79

कैसे GetValueOrDefault का उपयोग करने के बारे में , जो कि बहुत ही आत्म-व्याख्यात्मक है और आप जो भी डिफ़ॉल्ट चाहते हैं उसका उपयोग करने की अनुमति देता है:

if (nullableBool.GetValueOrDefault(false)) {
}

6
संदर्भ इस दृष्टिकोण फेंक सकती है निर्भर करता हैSystem.NotSupportedException: LINQ to Entities does not recognize the method 'Boolean GetValueOrDefault()' method, and this method cannot be translated into a store expression.
नैनो Taboada

3
मुझे यह दृष्टिकोण पसंद है क्योंकि यह एक गैर-इफ स्टेटमेंट (यानी असाइनमेंट) में भी काम करता है।
पॉल्टेकगूजी

48

आप इसे पसंद नहीं कर सकते हैं, लेकिन व्यक्तिगत रूप से मुझे लगता है

if (x.HasValue && x.Value)

सबसे पठनीय। यह स्पष्ट करता है कि आप एक अशक्त प्रकार के साथ काम कर रहे हैं और यह स्पष्ट करता है कि आप पहले जाँच कर रहे हैं कि क्या अशक्त प्रकार का सशर्त रूप से कार्य करने से पहले कोई मूल्य है या नहीं।

यदि आप अपना संस्करण लेते हैं और चर को x के साथ बदलते हैं तो यह भी पढ़ता है:

if (x ?? false)

क्या यह उतना ही स्पष्ट है? क्या यह स्पष्ट है कि x एक अशक्त प्रकार है? मैं आपको फैसला करने दूँगा।


AFAIK, ?? केवल अशक्त प्रकारों पर काम करता है। इसके अलावा चर का x = की तुलना में अच्छा नाम होना चाहिए
फायरस्नेक

5
"अशक्त प्रकार" से मेरा मतलब विशेष रूप से System.Nullable प्रकार से है। कोई भी संदर्भ प्रकार अशक्त हो सकता है। इसके अलावा, यदि आपको इसके नाम के हिस्से के रूप में एक चर का उपयोग करने की आवश्यकता है, तो यह संकेत है कि आपका कोड स्पष्ट नहीं है।
दान डिप्लो

@DanDiplo इसके लिए UT कैसे लिखें?
प्रशांत यादव 10

xसंदर्भ में ठीक है और कभी-कभी क्लीनर है; बुद्धि के लिए:var openOrders = orders.Where(x=>x.Open ?? false)
कुछ भी नहीं

21

यदि आप एक nullअसत्य के रूप में व्यवहार करना चाहते हैं , तो मैं कहूंगा कि ऐसा करने का सबसे संक्षिप्त तरीका यह है कि अशक्त कोलेसस ऑपरेटर ( ??) का उपयोग करें , जैसा कि आप वर्णन करते हैं:

if (nullableBool ?? false) { ... }

8

बस चोली की सोचो? 3 मान होने के बाद, तब चीजें आसान हो जाती हैं:

if (someNullableBool == true)     // only if true
if (someNullableBool == false)    // only if false
if (someNullableBool == null)     // only if null

8

एक्सटेंशन का उपयोग करें।

public static class NullableMixin {
    public static bool IsTrue(this System.Nullable<bool> val) {
        return val == true;
    }
    public static bool IsFalse(this System.Nullable<bool> val) {
        return val == false;
    }
    public static bool IsNull(this System.Nullable<bool> val) {
        return val == null;
    }
    public static bool IsNotNull(this System.Nullable<bool> val) {
        return val.HasValue;
    }
}


Nullable<bool> value = null;
if(value.IsTrue()) {
// do something with it
}

क्या होगा अगर आप के nullरूप में विचार करना चाहते हैं true?
थिबॉल्ट फालिज

IsTrue () | IsNull () .. :) मैंने तर्क को पुन: पेश किया कि SQL nulls के साथ कैसे काम करता है। मुझे लगता है कि यह सबसे साफ और समझने योग्य वाक्य रचना है।
एंड्री फ्रोलोव

यह सार्वजनिक स्थैतिक मल IsFalse होना चाहिए (यह System.Nullable val) {रिटर्न-वैल !!! सच; } शून्य को असत्य
मानने के लिए

2
यह अंतिम दो तरीकों (जैसे कि IsNull, और
IsNotNull

4

यह जाँचें कि नल के साथ तुलना कैसे परिभाषित की गई है:

static void Main()
    {
        Console.WriteLine($"null != null  => {null != null}");
        Console.WriteLine($"null == null  => {null == null}");
        Console.WriteLine($"null != true  => {null != true}");
        Console.WriteLine($"null == true  => {null == true}");
        Console.WriteLine($"null != false => {null != false}");
        Console.WriteLine($"null == false => {null == false}");
    }

और परिणाम हैं:

null != null  => False                                                                                                                                                                                                                                  
null == null  => True                                                                                                                                                                                                                                   
null != true  => True                                                                                                                                                                                                                                   
null == true  => False                                                                                                                                                                                                                                  
null != false => True                                                                                                                                                                                                                                   
null == false => False

तो आप सुरक्षित रूप से उपयोग कर सकते हैं:

// check if null or false
if (nullable != true) ...

// check if null or true
if (nullable != false) ...

// check if true or false
if (nullable != null) ...

Im सिर्फ सोच रहा था कि हम (अशक्त) क्यों नहीं कर सकते .... कि संभाल लिया जाएगा लेकिन सावधानी के साथ इलाज करने की आवश्यकता हैif(nullable)...else if(!nulllable)...else..
आयरनहाइड

मैं कहूंगा कि पिछले वर्षों के दौरान कोडिंग स्टाइल (स्टाइलकॉप, एनालाइजर इत्यादि जैसे उपकरणों की उपलब्धता के कारण) अधिक से अधिक असंदिग्ध, स्पष्ट, "इरादे की पुष्टि करने वाला" कोड है। ऑपरेटरों की प्राथमिकता, या विभिन्न एनोटेशन / अनुबंध प्रणालियों का उपयोग करना)। IMO इस तरह के एक वाक्यविन्यास को पेश करने में अस्पष्टता के स्तर के कारण बहुत अधिक भ्रम पैदा करेगा कि कैसे नल को लाभ की तुलना में नियंत्रित किया जाता है।
एस.जे. मोनोक

4

वास्तव में मुझे लगता है कि (nullableBool ?? false)यह एक वैध विकल्प है, खासकर जब आप लिंच में एक अशक्त बूल का मूल्यांकन करने की कोशिश कर रहे हैं।

उदाहरण के लिए:
array.Select(v => v.nullableBool ?? false)
(from v in array where v.nullableBool ?? false)

क्या मेरी राय में क्लीनर इसके विपरीत है:
array.Select(v => v.nullableBool.HasValue ? v.nullableBool.Value : false)
(from v in array where v.nullableBool.HasValue ? v.nullableBool.Value : false)


1

यदि आप केवल / के trueविरुद्ध परीक्षण करना चाहते हैं , तो मैंने अभी-अभी उपयोग किया है और काफी अच्छी तरह से पढ़ा हैnullfalse

bool? someCondition = null
if (someCondition.Equals(true))
...

1
क्या आपको यहां अशक्त संदर्भ अपवाद नहीं मिल रहा है?
चेस फ्लोरल

@ कैफ़फ़्लोरेल I को वीएस इंटरएक्टिव विंडो में इसे डबल चेक करना था .. इसलिए याद रखने वाली बात यह है कि सोचेन्डिशन का प्रकार Nullable <bool> है। आप अभी भी ऑब्जेक्ट से ली गई विधियों (जैसे इक्वल्स), HasValue और GetValueOrDefault को कॉल कर सकते हैं। , लेकिन मूल्य नहीं
ds4940

दिलचस्प है, मैं देख सकता हूँ कि अब। अभी भी संदर्भ प्रकार के लिए संक्षिप्त विवरण dotnetfiddle.net/8cAI21
चेस फ्लोरल

0

मुझे लगता है कि यह आप पर निर्भर है। मुझे निश्चित रूप से लगता है। .HasValue दृष्टिकोण अधिक पठनीय है, विशेष रूप से डेवलपर्स के साथ परिचित नहीं है ?? वाक्य - विन्यास।

एक अशक्त बूलियन प्रकार का दूसरा बिंदु यह है कि यह ट्रिस्टेट है, इसलिए हो सकता है कि आप कुछ और करना चाहते हैं जब यह सिर्फ अशक्त हो, और झूठे के लिए डिफ़ॉल्ट न हो।


0

एनम दी

public enum PublishMode { Edit, View }

आप इसे यहाँ पसंद कर सकते हैं

 void MyMethod(PublishMode? mode)
    {
       var publishMode = mode ?? PublishMode.Edit;

//or
       if (mode?? PublishMode.Edit == someValue)
       ....
    }

सवाल का जवाब नहीं, जिसके बारे में विशेष रूप से है nullable boolean
टूलमेकरसैट

0

यदि आप ऐसी स्थिति में हैं जहां आपका नियंत्रण नहीं है कि क्या स्थिति का हिस्सा एक अशक्त मूल्य की जाँच कर रहा है, तो आप हमेशा निम्न प्रयास कर सकते हैं:

if( someInt == 6 && someNullableBool == null ? false : (bool)someNullableBool){
    //perform your actions if true
}

मुझे पता है कि यह एक शुद्धतावादी दृष्टिकोण नहीं है अगर एक बयान में एक त्रिगुट डाल दिया जाए, लेकिन यह समस्या को सफाई से हल करता है।

यह निश्चित रूप से, कहने का एक मैनुअल तरीका है GetValueOrDefault(false)


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