C++で慣れていたように、変数には「bool」型を使用し、ブール値になると予想される関数またはプロパティの値を変数に入れようとします。ただし、結果タイプが「bool?」である場合がよくあります。 「bool」ではなく、暗黙的なキャストは失敗します。
2つの違いは何ですか?それぞれがいつ使用されますか?また、「bool」を使用する必要がありますか?変数の型として?これがベストプラクティスですか?
型の後の?
記号は、 Nullable type へのショートカットに過ぎません。bool?
はNullable<bool>
と同等です。
bool
は value type であるため、null
にすることはできないため、Nullable型では基本的に値の型をラップし、null
を割り当てることができます。
bool?
には、true
、false
、null
の3つの異なる値を含めることができます。
また、bool?
に対して定義されている短絡演算子(&& ||)はありません。
論理AND包含OR演算子のみが定義され、次のように動作します。
x y x & y x | y
true true true true
true false false true
true null null true
false true false true
false false false false
false null false null
null true null true
null false false null
null null null null
Nullable型は基本的に一般的な構造体であり、次のパブリックプロパティがあります。
public struct Nullable<T> where T: struct
{
public bool HasValue { get; }
public T Value { get; }
}
HasValue
プロパティは、現在のオブジェクトに値があるかどうかを示し、Value
プロパティはオブジェクトの現在の値を取得します。HasValueがfalseの場合、InvalidOperationExceptionをスローします。
今、あなたは何かを疑問に思っているにちがいありません、Nullableは構造体であり、nullにできない値型です。なぜ次のステートメントが有効なのでしょうか。
int? a = null;
その例はこれにコンパイルされます:
.locals init (valuetype [mscorlib]System.Nullable`1<int32> V_0)
IL_0000: ldloca.s V_0
IL_0002: initobj valuetype [mscorlib]System.Nullable`1<int32>
initobj の呼び出し。指定されたアドレスにある値型の各フィールドをnull参照または適切なプリミティブ型の0に初期化します。
それだけです、ここで起こっているのはデフォルトの struct initialization です。
int? a = null;
以下と同等です:
Nullable<int> a = new Nullable<int>();
bool?
はNULL可能ですが、bool
はNULL不可です。
bool? first;
bool second;
上記のコードでは、first
はnull
になり、second
はfalse
になります。
典型的な使用法の1つは、変数に割り当てが行われたかどうかを知りたい場合です。 bool
は値型(ちょうどint
、long
、double
、DateTime
および一部の他のタイプ)、常にデフォルト値(false
の場合はbool
、0
の場合はint
)。つまり、一部のコードにfalse
が割り当てられているためにfalse
であるか、まだ割り当てられていないためにfalse
であるかを簡単に知ることはできません。その場合bool?
が便利です。
あなたが見るたびに?型名に続く文字。Nullable<TypeName>
の省略形です。 Nullableは、値型がNULL値のように振る舞うことを可能にする特別な型です。これは、値の型が値以外の値を持つことを明示的に表現する方法です。
Boolの場合、変数を効果的にトライステート値に変換します
?
を追加すると、タイプがヌル可能になります。つまり、これを行うことができます:
bool? x = null;
そして、それはまったく問題ないでしょう。
ブール?は、ブール値がNULL可能であり、構造体の構文糖衣であることを意味しますNullable<bool>
。ブール値は値型であるため、nullに設定することはできませんが、データベースフィールドにnull値が含まれている可能性があるため、データアクセスクラスで好きな場合があります。
bool
にはtrue
とfalse
の値のみを含めることができますが、bool?
は、null
値を持つこともできます。
Boolを使用するもう1つの良い場所は? nullチェックを追加するメソッドにあります
public bool? IsTurkeyStillInFridge(Turkey turkey)
{
if (turkey == null)
return null;
else if (fridge.Contains(turkey))
return true;
else
return false;
}
bool? canStayAtDesk = IsTurkeyStillInFridge(turkey);
if (canStayAtDesk == null)
MessageBox.Show("No turkey this year, check for ham.");
else if (canStayAtDesk == true)
MessageBox.Show("Turkey for lunch. Stay at desk.");
else
MessageBox.Show("Turkey's gone, go out to lunch.");
boolは、trueとfalseの値を持つことができることを意味します。ブール? true、false、およびnullの値を設定できることを意味します。
日時およびブール値に対して機能します。