次の方法で共有


CA1027: FlagsAttribute で列挙値をマークします

TypeName

MarkEnumsWithFlags

CheckId

CA1027

分類

Microsoft.Design

互換性に影響する変更点

なし

原因

パブリック列挙型の値が、2 の累乗か、その列挙型で定義された他の値の組み合わせです。また、System.FlagsAttribute 属性が存在しません。 誤った規則違反のレポートを減らすために、連続する値のある列挙型の違反はレポートされません。

規則の説明

列挙型は、関連する名前付き定数が複数定義された値型です。 名前付き定数を有意に結合できる場合、列挙型に FlagsAttribute を適用します。 たとえば、使用できる曜日リソースを追跡するアプリケーションで、曜日の列挙値があるとします。 FlagsAttribute がある列挙値で各リソースの可用性をエンコーディングすると、どのような曜日の組み合わせでも、表現できます。 この属性がないと、曜日の 1 日しか表現できません。

結合できる列挙値がフィールドに格納されている場合、個々の列挙値は、そのフィールド内のビット グループとして扱われます。 そのため、このようなフィールドはビットフィールドと呼ばれることもあります。 1 つのビット フィールドに格納するために列挙値を結合するには、ブール型の条件演算子を使用します。 ビット フィールドをテストして、特定の列挙値が存在するかどうかを判断するには、ブール型の論理演算子を使用します。 ビット フィールドで結合された列挙値の格納と取得を正しく行うには、列挙値に定義する個々の値を 2 の累乗にする必要があります。 そうしないと、ブール型の論理演算子では、そのフィールドに格納されている個々の列挙値を抽出できなくなります。

違反の修正方法

この規則違反を修正するには、列挙型に FlagsAttribute を追加します。

警告を抑制する状況

列挙値を結合できるようにしない場合は、この規則による警告を抑制します。

使用例

次の例で、DaysEnumNeedsFlags は FlagsAttribute を使用する要件に適合していますが、実際には使用していません。 ColorEnumShouldNotHaveFlag 列挙体に 2 の累乗の値はありませんが、FlagsAttribute が誤って指定されています。 これは規則「CA2217: enums を FlagsAttribute に設定しません」に違反しています。

using System;

namespace DesignLibrary
{
// Violates rule: MarkEnumsWithFlags.

   public enum DaysEnumNeedsFlags 
   {
      None        = 0,
      Monday      = 1,
      Tuesday     = 2,
      Wednesday   = 4,
      Thursday    = 8,
      Friday      = 16,
      All         = Monday| Tuesday | Wednesday | Thursday | Friday
   }
   // Violates rule: DoNotMarkEnumsWithFlags.
   [FlagsAttribute]
   public enum ColorEnumShouldNotHaveFlag 
   {
      None        = 0,
      Red         = 1,
      Orange      = 3,
      Yellow      = 4
   }
}

関連規則

CA2217: enums を FlagsAttribute に設定しません

参照

参照

System.FlagsAttribute