列挙型は、軽量の状態情報に最適です。たとえば、色の列挙型 (青を除く) は、信号機の状態を照会するのに適しています。色の概念全体とそのすべての手荷物 (アルファ、色空間など) を含む真の色は重要ではありません。ライトがどの状態にあるかだけです。また、列挙型を少し変更して、信号機の状態を表します。 :
[Flags()]
public enum LightColors
{
unknown = 0,
red = 1,
yellow = 2,
green = 4,
green_arrow = 8
}
現在のライトの状態は次のように設定できます。
LightColors c = LightColors.red | LightColors.green_arrow;
そして次のようにクエリされます:
if ((c & LightColors.red) == LightColors.red)
{
//Don't drive
}
else if ((c & LightColors.green_arrow) == LightColors.green_arrow)
{
//Turn
}
静的クラスの色のメンバーは、追加機能なしでこの複数の状態をサポートできます。
ただし、静的クラス メンバーは、一般的に使用されるオブジェクトには最適です。メンバーは、System.Drawing.Color
あいまいなコンストラクターを持つ既知の名前の色を表すため、優れた例です (16 進数の色を知っている場合を除きます)。それらが列挙型として実装されている場合、値を色として使用するたびに、次のようにする必要があります。
colors c = colors.red;
switch (c)
{
case colors.red:
return System.Drawing.Color.FromArgb(255, 0, 0);
break;
case colors.green:
return System.Drawing.Color.FromArgb(0,255,0);
break;
}
したがって、列挙型を取得していて、オブジェクトを派生させるために switch/case/if/else/whatever を常に実行していることがわかった場合は、静的クラス メンバーを使用することをお勧めします。何かの状態のみを照会している場合は、列挙型に固執します。また、安全でない方法でデータを渡す必要がある場合は、オブジェクトのシリアル化されたバージョンよりも列挙型の方がおそらくうまく機能します。
編集:
@stakx、@Antonの投稿に応えて、あなたも何か重要なことに出くわしたと思います.
消費者の観点からは、System.Drawing.Color 静的クラス メンバーをすべて記述する必要があるよりも、はるかに好ましいと思います。しかし、プロデューサーの立場からすると、それをすべて書かなければならないのは大変なことです。したがって、他の人があなたのコードを使用する場合、書き込み/テスト/デバッグに 10 倍の時間がかかる場合でも、静的クラス メンバーを使用することで多くの問題を解決できる可能性があります。ただし、単に列挙型を使用し、必要に応じてキャスト/変換する方が簡単な場合があります。