CA1027:必須以 FlagsAttribute 標記列舉
型別名稱 |
MarkEnumsWithFlags |
CheckId |
CA1027 |
分類 |
Microsoft.Design |
中斷變更 |
中斷 |
原因
公用列舉的值是二的次方或在列舉中定義之其他值的組合,而且沒有 System.FlagsAttribute 屬性 (Attribute)。 為了要減少誤報情形,此規則不會針對具有連續值的列舉報告違規。
規則描述
列舉型別是一種實值型別 (Value Type),用以定義一組相關的具名常數。 當列舉型別的具名常數可以有意義地加以結合時,會將 FlagsAttribute 套用至此列舉型別。 例如,在追蹤哪一天資源可用的應用程式中,考慮星期天數的列舉。 如果每個資源的可用性都是使用具有 FlagsAttribute 的列舉予以編碼,則可以代表任何天數組合。 沒有這個屬性,則只可表示星期的其中一天。
對於儲存可組合列舉的欄位而言,個別的列舉值會被視為欄位中的位元群組。 因此,此種欄位有時候就是指「位元欄位」(Bit Field)。 若要結合儲存在位元欄位中的列舉值,請使用布林 (Boolean) 條件運算子。 若要測試位元欄位,判斷特定列舉值是否存在,請使用布林邏輯運算子。 若要使用位元欄位正確儲存和擷取結合的列舉值,列舉中所定義的每個值都必須為二的次方。 除非情況如此,否則布林邏輯運算子就無法抽取欄位中所儲存的個別列舉值。
如何修正違規
若要修正此規則的違規情形,請將 FlagsAttribute 加入至列舉型別。
隱藏警告的時機
如果您不想讓列舉值結合,請隱藏這項規則的警告。
範例
在下列範例中,DaysEnumNeedsFlags 為符合使用 FlagsAttribute 之需求的列舉型別 (但並不具有此屬性)。 ColorEnumShouldNotHaveFlag 列舉型別沒有為二的次方值,但卻錯誤地指定 FlagsAttribute。 這會違反CA2217:不要以 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:不要以 FlagsAttribute 標記列舉