2012-05-15 2 views
6

状態(ON、OFF、READY、...)を表す値のグループがあります。これらの値はintフィールドとしてDBにも格納されるので、ベストプラクティスでは、これをenum型にするか、クラスのconst int型を単なるものにするかと思います。C#Enumまたはint定数

Enumは人間の読み込み/コーディングには自然にフィットしているようですが、値がマップされている整数(またはDBから取得された値が正しくない状態にインスタンス化される)が重要であるということが隠れているようです。誰かが後で来て、列挙型や何かに新しい価値を加えて、すべてを取り除くかもしれません。

どちらが良い方法ですか?

+1

整数にも当てはまります!それぞれのenumに必要な値を設定することができ、コンパイラはあなたのコードを強制します。少なくとも次のように書くことはできません:myVar.MyEnum = 12345; –

+1

私はあなたの例として 'enum'を行っています。 Piは光の速度と同様に定数です。私の謙虚な意見ではあなたの国家のセットはありません。 – Ste

答えて

10

私はenumが可読性のための最良の選択であると思います。しかし、その値がDBに格納されますから、あなたが明示的に値を指定する必要があります。

enum State { On = 1, Off = 2, Ready = 3}; 
+0

+1 @OxedFrederikは、単に列挙型を宣言するのではなく、モデル内で**チェックすることで**有効です。任意の整数を列挙型にキャストできます。個人的に私はKevinが投稿した解決策を愛していました。 –

0

をあなたも列挙型の中で自分自身を値を決定することができ、すなわち:

誰かが新しい列挙型を追加してどのように
enum STATE {ON=2, OFF=9, READY=14}; 
3

値は新しい定数intと異なっていますか?

enumを特定の整数値に設定することができます。

易可読! 474は、データベースの状態に対応していない場合は

は、追加ボーナスとして、あなたは今

Widget.state = 474; 

のようなペテンを防ぐために、強い型付けを使用することができます。

+0

これは当てはまりますが、このタイプのものの中で最も揮発性の高い領域は、シリアル化が行われるアプリケーションの境界にあります。これは、 'StateEd'が' StateEnum'内の有効な値であれば、 'Widget.state =(StateEnum)stateId'やC#は**気にしない**というステートメントで終わります。 'stateId'は474. – Nick

+0

@Nickはい、あなたの入力をサニタイズします。 [これを行うためのenumメソッドもあります。](https://msdn.microsoft.com/en-us/library/system.enum.isdefined.aspx) – MushinNoShin

1

私は列挙型に行き、その列挙型がどのテーブルに対応しているかを非常によく文書化していることを確認します。

const intの束の危険は、型が有効な値が何であるかを示すものではなく、誰かが古い値を非常に簡単に割り当てることができるということです。あなたのコードの悪意のあるユーザーは、キャストでそれを行うことはできますが、自分の足で自分を撃つことを止めることはできません...

0

私はEnumsと言います。それらは、人間が読める形式のマシン形式のオプションを提供します。このように文書化してください。

///Summary 
/// About State Enum 
///Summary 
enum State : int 
{ 
    ///Summary 
    /// About Off Enum Value 
    ///Summary 
    Off = 0, 
    ///Summary 
    /// About On Enum Value 
    ///Summary 
    On, 
    ///Summary 
    /// About Ready Enum Value 
    ///Summary 
    Ready 
}; 

各メンバーに値を割り当てる必要はありません。 0から始まり、残りは自動的に増分されます。

あなたの列挙型は約on/offなので、ブール値で使うことができます。 0はFalseまたはoffを表し、1はtrueまたはonを表します。

また、あなたの列挙型はintとして、データベース内の

int value = (int)State.On; // value will have 1 

保存値のようにint型に変換することができます。そして自分の価値観はめったに変更される場合は、この

State st = (State)int.Parse(mydatabasevalue); 
1

のように行うことができます取得、またはあなたが編集し、コードを再コンパイルして問題がない場合は、必ずそれぞれの整数値の明示的な宣言で列挙型を使用しつつ、 。それ以外の場合は、データベースから値を取得するオブジェクトラッパーを作成します(パフォーマンスが心配な場合は、常に値をキャッシュできます)。次に、そのオブジェクトラッパーとのすべての比較を行います。コード内の列挙型を使用してコードを更新することなくデータベースの値が変更されないことを保証できない限り、それは揮発性で危険性が高いだけです。あなたが本当に冒険していて、コードを発行したいのであれば、それでかなりクールなことをすることができます。