2010-04-20 7 views
105

मैं सोच रहा था नल bools पर हालत चेकों करने के लिए सबसे स्वच्छ और समझा जा वाक्य रचना था क्या।सबसे अच्छा तरीका है एक शर्त अभिव्यक्ति में नल bool के लिए जाँच करने के लिए (यदि ...)

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

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

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

(यकीन नहीं है कि क्या सवाल से पहले ... खोज के साथ कुछ ऐसा ही नहीं पा सके कहा गया है)

उत्तर

216

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

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) बूल अगर कभी सच नहीं होगा?रिक्त है: पी

+11

ताज़ा आश्चर्यजनक अवलोकन! – seebiscuit

+0

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

0

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

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

25

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

if (x.HasValue && x.Value) 

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

आप अपने संस्करण लेते हैं और की जगह एक्स के साथ चर भी इसे पढ़ता है:

if (x ?? false) 

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

+0

afaik है? ? केवल शून्य प्रकारों पर काम करता है। इसके अलावा चर के पास x से बेहतर नाम होना चाहिए :) – FireSnake

+4

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

+4

यह उत्तर स्वीकार्य उत्तर से बहुत बेहतर और व्यावहारिक है ... –

16

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

if (nullableBool ?? false) { ... } 
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 
} 
+0

आपकी 'IsNotNull' एक्सटेंशन विधि गलत है। – Oded

+0

क्या होगा यदि आप 'शून्य' को 'सत्य' मानना ​​चाहते हैं? –

+0

IsTrue() | IsNull() .. :) मैंने लॉजिक को पुन: उत्पन्न किया कि SQL कैसे नल के साथ काम करता है। मुझे लगता है कि यह सबसे साफ और समझने योग्य वाक्यविन्यास है। –

44

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

if (nullableBool.GetValueOrDefault(false)) { 
} 
+2

संदर्भ इस दृष्टिकोण 'फेंक सकती है System.NotSupportedException निर्भर करता है(): संस्थाओं विधि को न पहचाने के लिए LINQ 'बूलियन GetValueOrDefault()' विधि, और इस विधि को स्टोर अभिव्यक्ति में अनुवादित नहीं किया जा सकता है। –

+1

धन्यवाद। मैं सिर्फ GetValueOrDefault() का उपयोग कर रहा हूं क्योंकि यह गलत है। –

0

को देखते हुए enum

public enum PublishMode { Edit, View } 

आप इसे यहां

की तरह कर सकते हैं
void MyMethod(PublishMode? mode) 
    { 
     var publishMode = mode ?? PublishMode.Edit; 

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

प्रश्न का उत्तर नहीं है, जो विशेष रूप से 'नालीबल बूलियन' के बारे में है। – ToolmakerSteve

-1

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

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

मुझे पता है यह बिल्कुल एक शुद्ध दृष्टिकोण नहीं है जो एक कथन में एक टर्नरी डालता है लेकिन यह इस मुद्दे को स्पष्ट रूप से हल करता है। जाहिर है, कह रही है की एक पुस्तिका रास्ता GetValueOrDefault(false)

+1

पर पाया जा सकता है ओपी में प्रदान किया गया समाधान वही बात है, लेकिन बहुत कम कोड ब्लोट के साथ। यह बिल्कुल फायदेमंद नहीं है। – Servy

2

चलें जाँच

इस तरह अशक्त के साथ तुलना परिभाषित किया गया है:

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) ... 
3

बस बूल के बारे में सोचो? 3 मूल्यों होने के रूप में, तो चीजों को आसान मिलती है:

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

आप केवल null/false, एक मैं बस का उपयोग किया है के खिलाफ true के लिए परीक्षण करना चाहते हैं और बहुत अच्छी तरह से पढ़ता है तो

bool? someCondition = null 
if (someCondition.Equals(true)) 
... 
संबंधित मुद्दे