私は C++ で慣れていたように変数に "bool" 型を使用し、ブール値であると予想される関数またはプロパティの値を変数に入れようとします。しかし、結果の型が「bool?」になっているケースによく遭遇します。"bool" ではなく、暗黙のキャストは失敗します。
2つの違いは何ですか?また、それぞれがいつ使用されるのですか? また、「bool」を使用する必要がありますか?私の変数の型として?これはベストプラクティスですか?
型の後の?
記号は、Nullable 型へのショートカットに過ぎず、bool?
と同等Nullable<bool>
です。
bool
は値型です。これは、それができないことを意味するnull
ため、基本的に Nullable 型を使用すると、値型をラップしてnull
、それらに割り当てることができます。
bool?
true
、false
およびの 3 つの異なる値を含めることができますnull
。
また、短絡演算子 (&& ||) は定義されていません。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 に初期化します。
それだけです。ここで起こっているのは、デフォルトの構造体の初期化です。
int? a = null;
以下と同等です。
Nullable<int> a = new Nullable<int>();
bool?
はnull可能ですが、bool
そうではありません。
bool? first;
bool second;
上記のコードでは、first
will be null
while second
will be false
.
典型的な用途の 1 つは、変数に代入が行われたかどうかを知りたい場合です。bool
は値型であるため( int
、long
、double
、DateTime
およびその他の型と同様)、常にデフォルト値に初期化されます ( false
abool
の0
場合、 an の場合int
)。false
これは、何らかのコードが割り当てられているためなfalse
のか、false
まだ割り当てられていないためなのかを簡単に知ることができないことを意味します。そんな時bool?
に重宝します。
あなたが見るたびに?型名に続く文字は、の省略形ですNullable<TypeName>
。Nullable は、値の型が null 値のように動作できるようにする特別な型です。これは、値の型が値以外の値を持つことができることを明示的に表現する方法です。
bool の場合、変数を実質的にトライステート値に変換します
を追加?
すると、型が null 可能になります。つまり、これを行うことができます:
bool? x = null;
そして、それはまったく問題ありません。
ブール?ブール値が null 可能であり、構造体のシンタックス シュガーであることを意味しNullable<bool>
ます。ブール値は値型であるため、null に設定することはできませんが、データベース フィールドに null 値を設定できるため、データ アクセス クラスで使用したい場合があります。
bool を使用する別の良い場所はありますか? 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
含めることができますが、 には値を含めるbool?
こともできnull
ます。
bool は、true と false の値を持つことができることを意味します。ブール?true、false、および null の値を持つことができることを意味します。
日時とブール値で機能します。