web-dev-qa-db-ja.com

「bool」と「bool」の違いは何ですか?

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

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

54
Roee Adler

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

boolvalue type であるため、nullにすることはできないため、Nullable型では基本的に値の型をラップし、nullを割り当てることができます。

bool?には、truefalsenullの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>();
87
CMS

bool?はNULL可能ですが、boolはNULL不可です。

bool? first;
bool second;

上記のコードでは、firstnullになり、secondfalseになります。

典型的な使用法の1つは、変数に割り当てが行われたかどうかを知りたい場合です。 bool値型(ちょうどintlongdoubleDateTimeおよび一部の他のタイプ)、常にデフォルト値(falseの場合はbool0の場合はint)。つまり、一部のコードにfalseが割り当てられているためにfalseであるか、まだ割り当てられていないためにfalseであるかを簡単に知ることはできません。その場合bool?が便利です。

14
Fredrik Mörk

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

Boolの場合、変数を効果的にトライステート値に変換します

  • 値あり:True
  • 値あり:False
  • 価値なし
5
JaredPar

?を追加すると、タイプがヌル可能になります。つまり、これを行うことができます:

bool? x = null;

そして、それはまったく問題ないでしょう。

4
Kredns

ブール?は、ブール値がNULL可能であり、構造体の構文糖衣であることを意味しますNullable<bool>。ブール値は値型であるため、nullに設定することはできませんが、データベースフィールドにnull値が含まれている可能性があるため、データアクセスクラスで好きな場合があります。

3
Charlie

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

2
RaYell

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.");
1
EricM

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

日時およびブール値に対して機能します。

0
user3008146