列挙体のデザイン
更新 : 2007 年 11 月
列挙体は定数値のセットを提供し、メンバを厳密に型指定してコードをわかりやすいものにします。列挙体には、簡単な列挙体とフラグ列挙体があります。簡単な列挙体に含まれる値は、ビットごとの比較で組み合わせたり使用したりできません。フラグ列挙体は、ビットごとの OR 演算子を使用して組み合わせることができます。フラグ列挙値の組み合わせはビットごとの AND 演算を使用してチェックされます。
次のガイドラインでは、列挙体のデザインに関する推奨事項を示します。
静的な定数よりも列挙体を使用してください。
次のコード例では、不適切なデザインを示します。
Public Class BadFurnishings
Public Shared Table As Integer = 1
Public Shared Chair As Integer = 2
Public Shared Lamp As Integer = 3
End Class
public static class BadFurnishings
{
public static int Table = 1;
public static int Chair = 2;
public static int Lamp = 3;
}
次のコード例では、静的な定数の代わりに列挙体を使用する必要があります。
Public Enum GoodFurnishings
Table
Chair
Lamp
End Enum
public enum GoodFurnishings
{
Table,
Chair,
Lamp
}
オペレーティング システムのバージョンなど、公開されている一連の値に対して列挙体を使用しないでください。
既に提供されている列挙体に値を追加すると既存のコードが破損することがあります。値の追加が許容されている場合もありますが、コードの破損につながる可能性のある列挙体のデザインは避けてください。
将来使用する目的で予約済みになっている列挙値を定義しないでください。
状況によっては、既存のコードが破損する可能性があっても、提供されている列挙体に値を追加することが必要な場合があります。このような場合は、その値を処理するための新しい列挙体とメンバを定義することもできます。
sentinel 値は列挙体に含めないでください。
sentinel 値は列挙体で値の境界を識別するために使用します。通常、sentinel 値は範囲のチェックに使用する値であり、有効なデータ値ではありません。sentinel 値を使用して列挙体を定義するコード例を次に示します。
Public Enum Furniture
Desk
Chair
Lamp
Rug
LastValue
End Enum
public enum Furniture
{
Desk,
Chair,
Lamp,
Rug,
LastValue // The sentinel value.
}
簡単な列挙体では必ずゼロ値を提供します。
可能であれば、この値を None と名付けてください。None が適切でない場合は、最もよく使用されている値 (既定値) にゼロ値を割り当てます。
次のいずれの条件も当てはまらないときは、列挙体の基になるデータ型として System.Int32 (ほとんどのプログラミング言語における既定のデータ型) を使用することを検討してください。
列挙体がフラグ列挙体で、32 を越えるフラグを使用する、または将来さらに多くのフラグを使用することが予想される。
さまざまなサイズの列挙体を使用するアンマネージ コードとの相互運用性をより容易に実現するために、基になる型を Int32 以外にする必要がある。
基になる型をより小さくすることによって、領域を大幅に節約できる。列挙体を主に制御フロー用の引数として使用する場合、サイズはあまり重要ではありません。次のような場合は、サイズを大幅に節約できる可能性があります。
特に頻繁にインスタンス化する構造体またはクラスのフィールドとして列挙体を使用する必要がある。
ユーザーが列挙体のインスタンスの大きな配列またはコレクションを作成する必要がある。
列挙体の多数のインスタンスをシリアル化する必要がある。
System.Enum は直接拡張しないでください。
一部のコンパイラでは、列挙体を生成するための言語固有のキーワードを使用して間接的に拡張する場合を除き、Enum の拡張は許可されていません。
Portions Copyright 2005 Microsoft Corporation.All rights reserved.
Portions Copyright Addison-Wesley Corporation.All rights reserved.
デザイン ガイドラインの詳細については、2005 年に Addison-Wesley から出版されている Krzysztof Cwalina、Brad Abrams 共著の『Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries』を参照してください。