フラグ列挙体のデザイン

フラグ列挙体は、ビット フィールドをマスクしたり、ビットごとの比較を実行したりするために使用します。これは、複数の列挙値を同時に指定できるときに使用するのに適したデザインです。たとえば、任意の GenericUriParserOptions 列挙値を組み合わせて、汎用の URI (Uniform Resource Identifier) パーサーを設定できます。

System.FlagsAttribute をフラグ列挙体に適用してください。この属性は、単純な列挙体に適用しないでください。

フラグ列挙体の値に 2 の累乗を使用し、これらの値をビットごとの OR 演算を使って自由に組み合わせることができるようにしてください。

メモ重要

2 の累乗または 2 の累乗の組み合わせを使用しない場合、ビットごとの演算は正常に機能しません。

よく使用されるフラグの組み合わせに特別な列挙値を与えることを検討してください。

フラグ列挙値の組み合わせは中級レベルのスキルであり、一般的なシナリオを実装する場合には必要ありません。たとえば、FileShare 列挙体には、読み取りまたは書き込み用として共有ファイルを開くことができることを指定する ReadWrite 値が含まれます。これにより、開発者は、読み取りまたは書き込み用として共有ファイルを開くことができることがわかり、列挙値の組み合わせを単一の値として指定する方法を習得する必要がなくなります。

値の特定の組み合わせが無効なときは、フラグ列挙体の作成を避けてください。

この問題は、通常、列挙体の意味が十分に正確でないことを示します。列挙体を複数の列挙体に分割し、各列挙体がより正確な値のセットを持つようにします。定義が不十分な列挙体の例を次に示します。

[Flags]
public enum PurchaseTypes
{
    SalePrice,
    RegularPrice,
    Book,
    CompactDisk
}

この列挙体は、次のメソッドで使用するために作成されています。

public float FindPriceForItem(string title, PurchaseTypes purchase)

このメソッドを呼び出すと、purchase パラメータは、SalePrice または RegularPrice のいずれか 1 つの値と、Book または CompactDisk のいずれか 1 つの値を指定します。開発者は、ドキュメントを参照したり、メソッドを試したりしないと、必要な値を特定できません。この場合、次のコード例に示すように 2 種類の情報を区別し、それぞれを独自の列挙体に配置するのがより適切な手法です。

public enum ItemType
{
    Book,
    CompactDisk
}

public enum PriceType
{
    SalePrice,
    RegularPrice,
}

これで、次のコード例に示すようにメソッド シグネチャが変更され、この再デザインを反映します。

public float FindPriceForItem(string title, ItemType name, PriceType price)

すべてのフラグがクリアされていることを示す場合を除き、フラグ列挙値をゼロに設定するのは避けてください。このような値には、次のガイドラインの説明に従って適切な名前を付ける必要があります。

このガイドラインはフラグ列挙体専用です。単純な列挙体ではゼロ値を使用できます。

フラグ列挙体のゼロ値には、None という名前を付けてください。フラグ列挙体では、この値は常に、フラグがすべてクリアされていることを意味します。

メモ重要

フラグ列挙体では、これ以外の状態を示すためにゼロ値を使用しないでください。フラグが設定されていないことはチェックできますが、ゼロ値のフラグが明示的に設定されていることはチェックできません。

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』を参照してください。

参照

概念

列挙体のデザイン
列挙体への値の追加

その他の技術情報

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