Null許容ブールを使用してトライステート値を格納することにメリットはありますか?例えば、 null == 1st state, false == 2nd state, true == 3rd state
?
オーバーヘッドはおそらくバイト列挙型を使用するよりも高くなりますが、私は興味があります。
少し主観的な質問ですが、読みやすさに影響するので、ノーと言います。
フレームワーク設計ガイドライン のコピーを入手する必要があります。
177ページに章があります列挙型パラメーターとブール型パラメーターの選択。
ポイントの1つは次のとおりです。
そうするのは間違いだと思います。
ブール値は「2状態」タイプです。これがその定義です。
C#、C++では、Javaなど。
3つの状態をシミュレートする場合は、四角いホイールを作り直すのではなく、列挙を実装するだけです。
使用する ?
null許容boolを含む構造体であるbool型の最後にマークを付けます。
bool? mytristatebool = null;
いいえ
Enumを選択することをお勧めします。これは、すでに3つの状態が手元にあり、スコープクリープを使用するとさらに増加する可能性があるためです。したがって、列挙型は3つの状態を説明するための安全な賭けであり、より正確で読みやすく、最も重要なのは、真でも偽でもない3番目の状態です。
最後に、このコードを後で見て、意味があり読みやすいものにする目のためのコーディングのようなものです。
WinFormsプログラムの場合、1つの可能性はSystem.Windows.Forms.CheckStateを使用することです。 Checked、Indeterminate、Uncheckedの値があり、目的に合う場合と合わない場合があります。
より簡単な回避策は、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に何度もアクセスする場合に、パフォーマンスチューニングに役立ちます。
場合によります。 'Has Dog'のようなプロパティに最適:True、False、または私たちにはわかりません。
不明またはまだ決定されていない場合は、nullに固執します。また、値を計算する可能性も失われます。全体として、良い考えではないと思います