CA1027:用 FlagsAttribute 标记枚举

类型名

MarkEnumsWithFlags

CheckId

CA1027

类别

Microsoft.Design

是否重大更改

非重大更改

原因

公共枚举的值是 2 的幂或枚举中定义的其他值的组合,而且 System.FlagsAttribute 特性不存在。 为减少误报,对于具有连续值的枚举,该规则不报告冲突。

规则说明

枚举是一种值类型,它定义一组相关的已命名常数。 如果可以按照有意义的方式组合一个枚举的已命名常数,则对该枚举应用 FlagsAttribute。 例如,在跟踪哪些日期资源可用的应用程序中,可考虑包含一周中各天的枚举。 如果在存在 FlagsAttribute 的情况下使用枚举编码每个资源的可用性,则可以表示一周中任意几天的组合。 如果没有该特性,则只能表示每周中的一天。

对于存储可组合枚举的字段,将单独枚举值视为该字段中的位组。 所以,这类字段有时称为“位字段”。 要组合枚举值以存储在位字段中,请使用布尔条件运算符。 要测试位字段以确定是否存在特定枚举值,请使用布尔逻辑运算符。 要使位字段能够正确存储和检索组合枚举值,枚举中定义的每个值都必须是 2 的幂。 除非满足该条件,否则布尔逻辑运算符将无法提取该字段中存储的单独枚举值。

如何解决冲突

要修复与该规则的冲突,请将 FlagsAttribute 添加到枚举。

何时禁止显示警告

如果您不希望枚举值可组合,请禁止显示此规则发出的警告。

示例

在下面的示例中,DaysEnumNeedsFlags 是符合使用 FlagsAttribute 的要求但不具有该属性的枚举。 ColorEnumShouldNotHaveFlag 枚举的值不是 2 的幂,但错误地指定了 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 标记枚举

请参见

参考

System.FlagsAttribute