次の列挙型を定義したと想像してください。
public enum Status : byte
{
Inactive = 1,
Active = 2,
}
Enumを使用するベストプラクティスは何ですか?上記の例のように1
で始まるか、次のように0
(明示的な値なし)で始まる必要があります。
public enum Status : byte
{
Inactive,
Active
}
Do非フラグ列挙にゼロの値を提供する列挙にNoneが適切でない場合、ゼロ値を要素に割り当てます。列挙型のデフォルト値として使用されます。
Avoid負またはゼロの通常のメンバーのフラグ列挙値を使用します。 ..ゼロの列挙値は、and操作などの問題を作成します。
まあ、私は明示的にそれらに番号を付けないと言っているほとんどの答えに同意しないと思います。私は常に明示的に番号を付けますが、ほとんどの場合、それらを整数値として保存されるデータストリームに永続化するためです。値を明示的に追加してから新しい値を追加しないと、シリアル化が中断され、古い永続オブジェクトを正確にロードできなくなります。これらの値の任意のタイプの永続ストアを実行する場合は、値を明示的に設定することを強くお勧めします。
変更する特別な理由がない限り、enumはデフォルト値(ゼロから始まる)のままにします。
public enum Status : byte
{
Inactive,
Active
}
Enumは値の型であり、明示的に初期化されていない場合、デフォルト値(クラスのEnumフィールドなど)は0になります。
したがって、通常、定義済みの定数として0が必要です(例:不明)。
この例では、Inactive
をデフォルトにしたい場合は、値をゼロにする必要があります。そうでない場合は、定数Unknown
を追加することを検討してください。
一部の人々は、定数の値を明示的に指定しないことを推奨しています。ほとんどの場合、おそらく良いアドバイスですが、そうしたい場合がいくつかあります。
フラグ列挙
値が外部システムとの相互運用に使用される列挙体(例:COM)。
私はベストプラクティスはそれらに番号を付けずに暗黙的にすることだと思います-これは0から始まります。
ブール型の列挙型を0から開始します。
「Inative」が「Inactive」以外の何かを意味しない限り:)
これはそれらの標準を保持します。
私は言うでしょう、それはあなたがそれらをどのように使うかに依存します。 enumにフラグを付けるには、次のようにNone
値に0を設定することをお勧めします。
[Flags]
enum MyEnum
{
None = 0,
Option1 = 1,
Option2 = 2,
Option3 = 4,
All = Option1 | Option2 | Option3,
}
列挙型がデータベースルックアップテーブルにマップされる可能性がある場合は、1から開始します。専門的に作成されたコードでは重要ではありませんが、読みやすさは向上します。
それ以外の場合は、そのままにしておきます。0で始まるか1で始まるかは関係ありません。
生の値を使用する正当な理由がない限り、暗黙の値のみを使用し、Status.Active
およびStatus.Inactive
でそれらを参照する必要があります。
欠点は、データをフラットファイルまたはDBに保存するか、他の人が作成したフラットファイルまたはDBを使用することです。自分で作成している場合は、Enumの使用目的に合わせて番号を付けてください。
データが自分のものでない場合は、もちろん、元の開発者が番号付けスキームとして使用したものを何でも使用したいと思うでしょう。
Enumをフラグのセットとして使用することを計画している場合、以下の価値がある簡単な規則があります。
enum Example
{
None = 0, // 0
Alpha = 1 << 0, // 1
Beta = 1 << 1, // 2
Gamma = 1 << 2, // 4
Delta = 1 << 3, // 8
Epsilon = 1 << 4, // 16
All = ~0, // -1
AlphaBeta = Alpha | Beta, // 3
}
値は2のべき乗である必要があり、ビットシフト演算を使用して表現できます。 None
、明らかに0
である必要がありますが、All
はそれほど明白ではありません-1
。 ~0
は、0
のバイナリ否定であり、すべてのビットが1
に設定された数値 になり、これは-1
の値を表します。複合フラグ(多くの場合、便宜上使用されます)の場合、ビット単位または演算子|
を使用して他の値をマージできます。
1から始めると、物事の数を簡単に取得できます。
{
BOX_THING1 = 1,
BOX_THING2 = 2,
BOX_NUM_THING = BOX_THING2
};
0から開始する場合、初期化されていないものの値として最初のものを使用します。
{
BOX_NO_THING = 0,
BOX_THING1 = 1,
BOX_THING2 = 2,
BOX_NUM_THING = BOX_THING2
};
番号を割り当てないでください。使用されるはずのように使用してください。
指定しない場合、番号付けは0から始まります。
列挙型は多くの場合、シリアル化され、文字列ではなくintとして格納されるため、明示的にすることが重要です。
データベースに保存されている列挙型については、常に明示的にオプションに番号を付けて、メンテナンス中のシフトと再割り当てを防ぎます。
Microsoftによると、推奨される規則では、最初のゼロオプションを使用して、初期化されていない、または最も一般的なデフォルト値を表します。
以下は、0ではなく1から番号付けを開始するショートカットです。
public enum Status : byte
{
Inactive = 1,
Active
}
列挙値にビット演算子を使用するためにフラグ値を設定する場合は、ゼロ値から番号付けを開始しないでください。
まず、理由に特定の値を指定しない限り(数値は他の場所、つまりデータベースまたは外部サービスを意味します)、数値をまったく指定せず、明示的にさせます。
第二に、常に値がゼロのアイテム(フラグ以外の列挙型)が必要です。その要素はデフォルト値として使用されます。
配列またはリストのインデックスとして使用するなどの理由がない限り、またはビット単位操作で使用するなどの実用的な理由がある場合は、0で開始しないでください。
enum
は、必要な場所から正確に開始する必要があります。また、シーケンシャルである必要もありません。値が明示的に設定されている場合、セマンティックな意味または実用的な考慮事項を反映する必要があります。たとえば、「[ボトル]のボトル」のenum
には1〜99の番号を付け、4の累乗のenum
はおそらく4から始まり、16、64、256などで続く必要があります。 。
さらに、enum
にゼロ値の要素を追加することは、それが有効な状態を表す場合にのみ行う必要があります。 「none」、「unknown」、「missing」などが有効な値である場合もありますが、多くの場合無効です。