59

私は C++ で慣れていたように変数に "bool" 型を使用し、ブール値であると予想される関数またはプロパティの値を変数に入れようとします。しかし、結果の型が「bool?」になっているケースによく遭遇します。"bool" ではなく、暗黙のキャストは失敗します。

2つの違いは何ですか?また、それぞれがいつ使用されるのですか? また、「bool」を使用する必要がありますか?私の変数の型として?これはベストプラクティスですか?

4

9 に答える 9

95

型の後の?記号は、Nullable 型へのショートカットに過ぎず、bool?と同等Nullable<bool>です。

bool値型です。これは、それができないことを意味するnullため、基本的に Nullable 型を使用すると、値型をラップしてnull、それらに割り当てることができます。

bool?truefalseおよびの 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>();
于 2009-07-25T07:35:50.770 に答える
16

bool?はnull可能ですが、boolそうではありません。

bool? first;
bool second;

上記のコードでは、firstwill be nullwhile secondwill be false.

典型的な用途の 1 つは、変数に代入が行われたかどうかを知りたい場合です。bool値型であるため( intlongdoubleDateTimeおよびその他の型と同様)、常にデフォルト値に初期化されます ( falseabool0場合、 an の場合int)。falseこれは、何らかのコードが割り当てられているためなfalseのか、falseまだ割り当てられていないためなのかを簡単に知ることができないことを意味します。そんな時bool?に重宝します。

于 2009-07-25T07:36:25.277 に答える
6

あなたが見るたびに?型名に続く文字は、の省略形ですNullable<TypeName>。Nullable は、値の型が null 値のように動作できるようにする特別な型です。これは、値の型が値以外の値を持つことができることを明示的に表現する方法です。

bool の場合、変数を実質的にトライステート値に変換します

  • 値: True
  • 値: False
  • 値なし
于 2009-07-25T07:37:32.857 に答える
4

を追加?すると、型が null 可能になります。つまり、これを行うことができます:

bool? x = null;

そして、それはまったく問題ありません。

于 2009-07-25T18:41:41.663 に答える
3

ブール?ブール値が null 可能であり、構造体のシンタックス シュガーであることを意味しNullable<bool>ます。ブール値は値型であるため、null に設定することはできませんが、データベース フィールドに null 値を設定できるため、データ アクセス クラスで使用したい場合があります。

于 2009-07-25T07:39:45.410 に答える
3

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.");
于 2015-12-01T17:44:11.463 に答える
2

booltrueにはと の値のみをfalse含めることができますが、 には値を含めるbool?こともできnullます。

于 2009-07-25T07:37:32.890 に答える
0

bool は、true と false の値を持つことができることを意味します。ブール?true、false、および null の値を持つことができることを意味します。

日時とブール値で機能します。

于 2013-12-04T12:44:47.710 に答える