2011-05-13 13 views
10

私は、アプリケーション固有のコードセット(コードをその名前に1対1にマッピングする)を持っています。私はそれらを表すためにC#でenumを使用しています。それが必要なのかどうかわからない。値が変化したことがない、と彼らは常にこれらのラベルに関連付けしようとしている。列挙定数と静的メンバーを含むクラス?

Workflow_Status_Complete = 1 
Workflow_Status_Stalled = 2 
Workflow_Status_Progress = 3 
Workflow_Status_Complete = 4 
Workflow_Status_Fail = 5 

は、私は、静的メンバーと、列挙型またはクラスを使用する必要がありますか?

答えて

11

int型の静的メンバーは、私に列挙型に比べて劣っているようです。あなたはenumのtypesafetyを失う。デバッグの際には、記号的な名前は表示せず、数字だけを表示します。

一方、エントリが単なる名前/整数値のペア以外のもので構成されている場合、クラスは良い考えです。しかし、フィールドはintでなくそのクラスでなければなりません。次のようなものがあります。

+3

+1; enumを使用せずに、 'Enum.GetValues'と' Enum.GetNames'で値をプログラムで*列挙することもできなくなります。コンボボックスなどに入力するとき –

+1

これらの列挙機能をクラスに追加することは、リフレクション列挙の静的フィールドに基づいて難しくありません。 – CodesInChaos

+1

もちろん難しくありません。ポイントは列挙型で、 (名前付け規則に基づいて個々の値を仮定しているので、あまり安全ではありません) –

1

State Patternを参照してください。より良いデザインです。あなたが使用しているアイデアでは、大変なswitch/if-elseステートメントになります。

2

列挙型を使用してください。たとえあなたのコードが決して変更されないとしても、検査だけで値が何を表しているのかを知ることは難しいでしょう。 enumを使用することの多くの強みの1つ。

enum RealEnum : uint 
{ 
    SomeValue = 0xDEADBEEF, 
} 
static class FakeEnum 
{ 
    public const uint SomeValue = 0xDEADBEEF; 
} 

var x = RealEnum.SomeValue; 
var y = FakeEnum.SomeValue; 
// what's the value? 
var xstr = x.ToString(); // SomeValue 
var ystr = y.ToString(); // 3735928559 

特に多くの異なる値がある場合は、デバッガでさえも役立ちません。

+0

id/value/descriptionプロパティを持つ独自の型を使用できます。 uintの広告。 ToString()をオーバーライドしたり、System.Diagnostics.DebuggerDisplayを使用して型の表示方法をパーソナライズすることもできます。 – JoanComasFdz

0

詳細情報を提供し、コードを「正しく使用しやすく、間違って使いにくくする」ように、私は列挙型に頼ります。 (引用符はThe Pragmatic Programmerからのものだと思います。

関連する問題