Nullable boolの条件チェックを行うための最もクリーンでわかりやすい構文は何だろうと思っていました。
次のコーディングスタイルは適切ですか?状態をより良く/よりきれいに表現する方法はありますか?
bool? nullableBool = true;
if (nullableBool ?? false) { ... }
else { ... }
特にif(nullableBool ?? false)部分。 if (x.HasValue && x.Value)
スタイルが気に入らない...
(質問が以前に尋ねられたかどうかわからない...検索で類似したものを見つけることができなかった)
多くの人がこの値が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
GetValueOrDefault を使用するのはどうですか?
if (nullableBool.GetValueOrDefault(false)) {
}
あなたはそれを好きではないかもしれませんが、個人的に私は見つけます
if (x.HasValue && x.Value)
最も読みやすい。これにより、null許容型を操作していることが明確になり、null許容型に値が設定されているかどうかを条件付きで操作する前に最初にチェックしていることが明確になります。
バージョンを取得して変数をxに置き換えると、次のようになります。
if (x ?? false)
それは明らかですか? xがnull許容型であることは明らかですか?決めさせてあげます。
null
をfalseとして扱いたい場合、最も簡潔な方法は、説明したように、null合体演算子(??
)を使用することです。
if (nullableBool ?? false) { ... }
拡張機能を使用します。
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
}
Boolを考えてみてください? 3つの値を持っていると、物事は簡単になります:
if (someNullableBool == true) // only if true
if (someNullableBool == false) // only if false
if (someNullableBool == null) // only if null
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) ...
実際、(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)
true
に対してnull
/false
に対してのみテストしたい場合、私が使用したばかりで非常に読みやすい
bool? someCondition = null
if (someCondition.Equals(true))
...
あなた次第だと思います。私は確かに、特に??に慣れていない開発者にとって、.HasValueアプローチはより読みやすいと思います。構文。
NULL可能ブール型のもう1つのポイントは、トライステートであるということです。そのため、デフォルトがfalseではなく、nullの場合に何か他のことをしたい場合があります。
指定された列挙型
public enum PublishMode { Edit, View }
ここのようにできます
void MyMethod(PublishMode? mode)
{
var publishMode = mode ?? PublishMode.Edit;
//or
if (mode?? PublishMode.Edit == someValue)
....
}
条件の一部がnull値をチェックしているかどうかを制御できない状況にある場合は、いつでも次のことを試すことができます。
if( someInt == 6 && someNullableBool == null ? false : (bool)someNullableBool){
//perform your actions if true
}
私はそれがif文に三項を入れる純粋なアプローチではないことを知っていますが、それは問題をきれいに解決します。
これはもちろん、手動でGetValueOrDefault(false)
と言う方法です