条件式でnull許容のブール値をチェックする最良の方法(…の場合)


207

null許容ブール値の条件チェックを実行するための最もクリーンで理解可能な構文は何だろうと思っていました。

次のコーディングスタイルは良いですか、悪いですか?状態をよりよく/よりきれいに表現する方法はありますか?

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

特にif(nullableBool ?? false)の部分。if (x.HasValue && x.Value)スタイルが気に入らない...

(以前に質問されたかどうかわからない...検索で同様のものが見つからなかった)

回答:


361

多くの人がこの値がnull可能であるという事実に集中しており、実際に何が必要かについては考えていません。

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)boolの場合、trueを返すことはありませんか?nullです:P


2
null可能比較がこのように意味があることに気づきませんでした。詳細については、msdn.microsoft.com
en

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.
Nano Taboada

3
if以外のステートメント(つまり、代入)でも機能するため、このアプローチが好きです。
paultechguy 2018年

48

気に入らないかもしれませんが、個人的には

if (x.HasValue && x.Value)

最も読みやすい。これにより、null許容型で作業していることが明確になり、null許容型に値があるかどうかを最初にチェックしてから、条件付きで操作できることがわかります。

バージョンを取得して変数をxに置き換えると、次のようになります。

if (x ?? false)

それは明らかですか?xがnull許容型であることは明らかですか?決めさせていただきます。


私の知る限り、 ??null許容型でのみ機能します。さらに、変数にはxよりも
適切な

5
「null許容型」とは、特にSystem.Nullable型を意味しました。参照型はすべてnullにすることができます。また、変数の型をその名前の一部として使用する必要がある場合は、コードが明確でないことを示しています。
Dan Diplo

@DanDiploこのためにUTを書くには?
Prashant Yadav

x状況に応じて問題なく、ときにはクリーンです。ウィットに:var openOrders = orders.Where(x=>x.Open ?? false)
nothingisnecessary

21

a nullをfalseとして扱いたい場合、説明するように、最も簡単な方法は、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
Thibault Falise、2010

IsTrue()| IsNull().. :) SQLがnullを処理する方法のロジックを再現しました。私はそれが最もクリーンで理解しやすい構文だと思います。
Andrey Frolov 2010

パブリック静的bool IsFalse(this System.Nullable val){return!val ?? 真; } nullをfalseと見なす
Michael Freidgeim 2010

2
最後の二つの方法(つまりは、IsNull、およびIsNotNull)で、()には、セミコロンが欠落することができる
グレン・ギャルソン

4

nullとの比較がどのように定義されているかを確認してみましょう。

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

私はなぜif(nullable)ができないのか疑問に思っています....それは処理されますが、注意して処理する必要がありますif(nullable)...else if(!nulllable)...else..
IronHide

去年の間、コーディングスタイル(stylecop、アナライザーなどのツールが利用可能になったため)はますます明確で明確な「意図を確認する」コード(たとえば、意図した使用法を確認するためだけに不要な括弧を使用することを推奨する)をますます好みますオペレーターの優先順位、またはさまざまな注釈/契約システムの使用)。IMOがこのような構文を導入すると、null値の処理方法が不明確になるため、利点よりもはるかに混乱が生じます。
Sz。モンチ

4

実際、私はそれ(nullableBool ?? false)が正当な選択肢だと思います。特に、linqでnull許容のブール値を評価しようとしている場合はそうです。

例えば:
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
ここでnull参照例外が発生していませんか?
チェイスフローレル

@ChaseFlorell VS Interactiveウィンドウでこれを再確認する必要がありました。したがって、覚えておくべきことは、ある条件のタイプがNullable <bool>であることです。オブジェクトから継承されたメソッド(Equalsなど)、HasValue、GetValueOrDefaultを呼び出すこともできます。 、ただしValueではありません
ds4940

興味深いことに、私はそれを今見ることができます。参照タイプdotnetfiddle.net/8cAI21
チェイスフローレル

0

それはあなた次第だと思います。私は確かに.HasValueアプローチの方が読みやすいと思います。特に、?? 構文。

null可能なブール型のもう1つのポイントは、それがトライステートであることです。そのため、それがnullで、デフォルトがfalseではないときに、別のことを実行する必要がある場合があります。


0

列挙型を与える

public enum PublishMode { Edit, View }

あなたはここのようにそれを行うことができます

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

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

特にに関する質問への回答ではありませんnullable boolean
ToolmakerSteve、2015

0

条件の一部がnull許容値をチェックしているかどうかを制御できない状況にある場合は、いつでも次のことを試すことができます。

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

ifステートメントに三項を入れるという純粋なアプローチではないことは知っていますが、問題をきれいに解決します。

これはもちろん、手動で言う方法です GetValueOrDefault(false)


3
OPで提供されるソリューションは同じですが、コードの膨張がはるかに少なくなります。これはそれにとってまったく有利ではありません。
サービー2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.