列挙体のデザイン

列挙体は定数値のセットを提供し、メンバーを厳密に型指定してコードをわかりやすいものにします。 列挙体には、簡単な列挙体とフラグ列挙体があります。 簡単な列挙体に含まれる値は、ビットごとの比較で組み合わせたり使用したりできません。 フラグ列挙体は、ビットごとの 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
}

オペレーティング システムのバージョンなど、公開されている一連の値に対して列挙体を使用しないでください。

既に提供されている列挙体に値を追加すると既存のコードが破損することがあります。 値の追加が許容されている場合もありますが、コードの破損につながる可能性のある列挙体のデザインは避けてください。

将来使用する目的で予約済みになっている列挙値を定義しないでください。

状況によっては、既存のコードが破損する可能性があっても、提供されている列挙体に値を追加することが必要な場合があります。 このような場合は、その値を処理するための新しい列挙体とメンバーを定義することもできます。

1 つしか値を持たない列挙体を公開することは避けてください。

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.

設計ガイドラインの詳細についてを参照してください、「フレームワークの設計ガイドライン。規則、慣用句、および再利用可能なパターン。ネット ライブラリ」本クシシュトフ Cwalina、ブラッド エイブラムス、アスキー、2005 年発表しました。

参照

概念

フラグ列挙体のデザイン

列挙体への値の追加

その他の技術情報

型のデザインのガイドライン

クラス ライブラリ開発のデザイン ガイドライン