web-dev-qa-db-ja.com

C#のトライステート変数としてのnull許容ブール

Null許容ブールを使用してトライステート値を格納することにメリットはありますか?例えば、 null == 1st state, false == 2nd state, true == 3rd state

オーバーヘッドはおそらくバイト列挙型を使用するよりも高くなりますが、私は興味があります。

21
Petrus Theron

少し主観的な質問ですが、読みやすさに影響するので、ノーと言います。

16
Nick

フレームワーク設計ガイドライン のコピーを入手する必要があります。

177ページに章があります列挙型パラメーターとブール型パラメーターの選択

ポイントの1つは次のとおりです。

  • 2つ以上の値が必要になることが絶対にないことが絶対に確実でない限り、ブール値を使用しないでください
16
Oliver

そうするのは間違いだと思います。

ブール値は「2状態」タイプです。これがその定義です。

C#、C++では、Javaなど。

3つの状態をシミュレートする場合は、四角いホイールを作り直すのではなく、列挙を実装するだけです。

4

使用する ?null許容boolを含む構造体であるbool型の最後にマークを付けます。

bool? mytristatebool = null;
3
Sam Saarian

いいえ

Enumを選択することをお勧めします。これは、すでに3つの状態が手元にあり、スコープクリープを使用するとさらに増加する可能性があるためです。したがって、列挙型は3つの状態を説明するための安全な賭けであり、より正確で読みやすく、最も重要なのは、真でも偽でもない3番目の状態です。

最後に、このコードを後で見て、意味があり読みやすいものにする目のためのコーディングのようなものです。

3
V4Vendetta

WinFormsプログラムの場合、1つの可能性はSystem.Windows.Forms.CheckStateを使用することです。 Checked、Indeterminate、Uncheckedの値があり、目的に合う場合と合わない場合があります。

2
RenniePet

より簡単な回避策は、2つのブール変数を使用することです。 1つはnull/not-nullを保持し、もう1つはtrue/falseを保持します

アプリケーションこれの:

ブールプロパティに計算をキャッシュするときは、計算がすでに設定されているかどうかを知る必要があります。

例えば.

// actual variable having true/false
private bool isX = false;
// variable holding wither above is set/not-set i.e. null/not-null
private bool isXSet = false;

public bool IsX
{
   get
   {
      if (isXSet)
      {
         return isX;
      }
      else
      {
         isX = GetX(); // this could be time consuming.
         isXSet = true;
         return isX;
      }
   }
}

これは、上記のGetX()に時間がかかり、IsXに何度もアクセスする場合に、パフォーマンスチューニングに役立ちます。

1

場合によります。 'Has Dog'のようなプロパティに最適:True、False、または私たちにはわかりません。

0
Chalky

不明またはまだ決定されていない場合は、nullに固執します。また、値を計算する可能性も失われます。全体として、良い考えではないと思います

0
Pleun