次のEnumを定義したとしましょう。
public enum Status : byte
{
Inactive = 1,
Active = 2,
}
列挙型を使用するためのベストプラクティスは何ですか?1
上記の例のように開始するか、次のように0
(明示的な値なしで)開始する必要があります。
public enum Status : byte
{
Inactive,
Active
}
次のEnumを定義したとしましょう。
public enum Status : byte
{
Inactive = 1,
Active = 2,
}
列挙型を使用するためのベストプラクティスは何ですか?1
上記の例のように開始するか、次のように0
(明示的な値なしで)開始する必要があります。
public enum Status : byte
{
Inactive,
Active
}
回答:
simple️単純な列挙型ではゼロの値を提供します。
「なし」などの値を呼び出すことを検討してください。そのような値がこの特定の列挙型に適切でない場合は、列挙型の最も一般的なデフォルト値に、基礎となるゼロの値を割り当てる必要があります。
flag値が「すべてのフラグがクリアされている」ことを表し、次のガイドラインで規定されているように適切に名前が付けられていない限り、ゼロのフラグ列挙値を使用しないでください。
✔️フラグ列挙型のゼロ値にNoneと名前を付けます。フラグ列挙型の場合、値は常に「すべてのフラグがクリアされている」ことを意味する必要があります。
switch
ステートメントでは、default
セクションにジャンプしてをスローしInvalidEnumArgumentException
ます。そうしないと、プログラムが意図せずに列挙のゼロ値で実行を継続する場合があります。これは有効であり、気付かれない可能性があります。
まあ、私はそれらに明示的に番号を付けないように言うほとんどの答えに同意しないと思います。私は常に明示的に番号を付けていますが、それはほとんどの場合、整数値として格納されているデータストリームにそれらを永続化することになるためです。値を明示的に追加せずに新しい値を追加すると、シリアル化が中断され、古い永続化オブジェクトを正確にロードできなくなります。これらの値を永続的に保存する場合は、値を明示的に設定することを強くお勧めします。
Enumは値の型であり、明示的に初期化されていない場合、そのデフォルト値(クラスのEnumフィールドなど)は0になります。
したがって、一般的には、定義された定数(たとえば、不明)として0が必要です。
あなたの例では、あなたInactive
がデフォルトになりたいなら、それはゼロの値を持つべきです。それ以外の場合は、定数を追加することを検討してくださいUnknown
。
定数の値を明示的に指定しないことを推奨する人もいます。ほとんどの場合はおそらく良いアドバイスですが、そうしたい場合もいくつかあります。
フラグ列挙型
値が外部システム(COMなど)との相互運用で使用される列挙型。
[Flags] enum MyFlags { None = 0, A, B, Both = A | B, /* etc. */ }
、より読みやすくなり[Flags] enum MyFlags { None = 0, A = 1, B = 2, Both = 3, /* etc */ }
ます。)
[Flags] enum MyFlags { None=0, A, B, C }
結果[Flags] enum MyFlags { None=0, A=1, B=2, C=3 }
はになりますが、Flags列挙型の場合、通常はC = 4が必要です。
私はベストプラクティスはそれらに番号を付けないことであり、それを暗黙的にすることです-それは0から始まります。その暗黙的であるため、常に従うのが良い言語設定です:)
私はブール型の列挙を0で始めます。
「ネイティブ」が「非アクティブ」以外のものを意味しない限り:)
これはそれらのための標準を保持します。
どういうふうに使うかによりますね。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
。複合フラグ(便宜上よく使用される)の場合、他の値はビットごとのor演算子を使用してマージできます|
。
指定されていない場合、番号付けは0から始まります。
enumは文字列ではなくシリアル化されてintとして保存されることが多いため、明示することが重要です。
データベースに保存されている列挙型については、メンテナンス中のシフトと再割り当てを防ぐために、常に明示的にオプションに番号を付けます。
Microsoftによれば、推奨される規則は、最初のゼロオプションを使用して、初期化されていない、または最も一般的なデフォルト値を表すことです。
以下は、番号付けを0ではなく1から開始するためのショートカットです。
public enum Status : byte
{
Inactive = 1,
Active
}
列挙値にビット演算子を使用するためにフラグ値を設定する場合は、ゼロ値から番号付けを開始しないでください。
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から開始しないでください。
あなたenum
はそれが必要なところから正確に始めるべきです。順次である必要もありません。値が明示的に設定されている場合は、意味的な意味や実際の考慮事項を反映する必要があります。たとえばenum
、「壁のボトル」には1〜99の番号を付け、enum
、4の累乗の場合は、4から始めて16、64、256などにする必要があります。
さらに、ゼロ値要素をに追加するenum
ことは、それが有効な状態を表す場合にのみ行う必要があります。「なし」、「不明」、「欠落」などが有効な値の場合もありますが、そうでない場合もあります。