web-dev-qa-db-ja.com

条件式でヌル可能ブールをチェックする最良の方法(if ...)

Nullable boolの条件チェックを行うための最もクリーンでわかりやすい構文は何だろうと思っていました。

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

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

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

(質問が以前に尋ねられたかどうかわからない...検索で類似したものを見つけることができなかった)

177
FireSnake

多くの人がこの値が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)はブールが真の場合にtrueを返しませんか? null:P

310
Artiom Chilaru

GetValueOrDefault を使用するのはどうですか?

if (nullableBool.GetValueOrDefault(false)) {
}
63
Lucero

あなたはそれを好きではないかもしれませんが、個人的に私は見つけます

if (x.HasValue && x.Value)

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

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

if (x ?? false)

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

39
Dan Diplo

nullをfalseとして扱いたい場合、最も簡潔な方法は、説明したように、null合体演算子(??)を使用することです。

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

拡張機能を使用します。

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
}
8
Andrey Frolov

Boolを考えてみてください? 3つの値を持っていると、物事は簡単になります:

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

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

実際、(nullableBool ?? false)は正当なオプションであり、特にlinqでNULL可能boolを評価しようとするときは正しいと思います。

例:
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)

3
Zze

trueに対してnull/falseに対してのみテストしたい場合、私が使用したばかりで非常に読みやすい

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

あなた次第だと思います。私は確かに、特に??に慣れていない開発者にとって、.HasValueアプローチはより読みやすいと思います。構文。

NULL可能ブール型のもう1つのポイントは、トライステートであるということです。そのため、デフォルトがfalseではなく、nullの場合に何か他のことをしたい場合があります。

0
James Westgate

指定された列挙型

public enum PublishMode { Edit, View }

ここのようにできます

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

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

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

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

私はそれがif文に三項を入れる純粋なアプローチではないことを知っていますが、それは問題をきれいに解決します。

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

0
MetalPhoenix