列挙型は確かにコードを読みやすくすることができます。(少なくとも.netでは)まだ注意すべきことがいくつかあります
enumの基礎となるストレージはintであるため、デフォルト値はゼロになるため、0が適切なデフォルトであることを確認する必要があります。(たとえば、構造体は作成時にすべてのフィールドをゼロに設定するため、0以外のデフォルトを指定する方法はありません。0の値がない場合、intにキャストせずに列挙型をテストすることもできません。悪いスタイル。)
enumがコードに対してプライベートである(決して公開されていない)場合は、ここで読むのをやめることができます。
列挙型が公開されている場合何らかの方法で外部コードにれているか、プログラム外で保存されている場合は、明示的に番号を付けることを検討してください。コンパイラーは自動的にそれらに0から番号を付けますが、値を指定せずに列挙型を再配置すると、欠陥が生じる可能性があります。
合法的に書ける
WriteMode illegalButWorks = (WriteMode)1000000;
file.Write( data, illegalButWorks );
これに対抗するには、特定できない列挙型を使用するコード(たとえば、パブリックAPI)は、列挙型が有効かどうかを確認する必要があります。これは
if (!Enum.IsDefined(typeof(WriteMode), userValue))
throw new ArgumentException("userValue");
の唯一の注意点Enum.IsDefined
は、リフレクションを使用し、速度が遅いことです。また、バージョンの問題も発生します。列挙値を頻繁に確認する必要がある場合は、次の方法をお勧めします。
public static bool CheckWriteModeEnumValue(WriteMode writeMode)
{
switch( writeMode )
{
case WriteMode.Append:
case WriteMode.OverWrite:
break;
default:
Debug.Assert(false, "The WriteMode '" + writeMode + "' is not valid.");
return false;
}
return true;
}
バージョニングの問題は、古いコードでは、2つの列挙型の処理方法しか認識できない場合があることです。3番目の値を追加すると、Enum.IsDefinedはtrueになりますが、古いコードは必ずしもそれを処理できません。おっと。
[Flags]
列挙型を使用すると、さらに楽しいことができます。そのための検証コードは少し異なります。
私はまた、移植のために、あなたが呼び出しを使用する必要があることに注意しましょうToString()
列挙型で、かつ使用をEnum.Parse()
後ろにそれらを読むとき。両方ToString()
とEnum.Parse()
扱うことができます[Flags]
enumため、使用しない理由はありません。ちなみに、コードを壊すことなく列挙型の名前を変更することはできないため、これはもう1つの落とし穴です。
それで、あなたが自分自身に尋ねるとき、あなたは時々あなたは上記のすべてを比較検討する必要があります私はブールだけで逃れることができますか?