设计标志枚举

标志枚举用于屏蔽位域及执行按位比较。 在可以同时指定多个枚举值的情况下,它们是可使用的正确设计。 例如,可以任意组合 GenericUriParserOptions 枚举值以配置一般的统一资源标识符 (URI) 分析器。

将 System.FlagsAttribute 应用于标志枚举。 不要将此特性应用于简单枚举。

对标志枚举值使用 2 的幂,以便这些值可以使用按位“或”运算自由组合。

重要说明重要事项

必须使用 2 的幂或 2 的幂组合,按位运算才能正常执行。

考虑为常用的标志组合提供特殊的枚举值。

组合标志枚举值是一种中级技能,对于实现常见方案的开发人员来说不是必需的。 例如,FileShare 枚举包含 ReadWrite 值以指定可以打开共享文件进行读写。 这向开发人员表明他们可以打开共享文件进行读写,并且他们无需了解如何将枚举值组合指定为单个值。

在某些组合值无效时,避免创建标志枚举。

此问题通常表明该枚举的含义不够精确。 请考虑将该枚举划分为两个或多个枚举,使每个枚举都有一组更精确的值。 例如,让我们来看看以下的未正确定义的枚举。

<Flags()> _
Public Enum PurchaseTypes

    SalePrice
    RegularPrice
    Book
    CompactDisk

End Enum

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

设计器意欲将该枚举与以下方法一起使用。

Public Overloads Function FindPriceForItem(ByVal title As String, ByVal purchase As PurchaseTypes) As Single
    Return 0
End Function
public float FindPriceForItem(string title, PurchaseTypes purchase)

在调用该方法时,purchase 参数只指定 SalePrice 或 RegularPrice 值中的一个值,并且只指定 Book 或 CompactDisk 值中的一个值。 除非开发人员查阅了相关文档或有使用该方法的经验,否则将无法确定这种要求。 最好是将这两类信息分开,将每类信息分别放在各自的枚举中,如下面的代码示例所示。

Public Enum ItemType

    Book
    CompactDisk

End Enum

Public Enum PriceType

    SalePrice
    RegularPrice

End Enum

public enum ItemType
{
    Book,
    CompactDisk
}

public enum PriceType
{
    SalePrice,
    RegularPrice,
}

该方法的签名现在将相应地更改以反映这一重新设计,如下面的代码示例所示。

Public Overloads Function FindPriceForItem(ByVal title As String, ByVal name As ItemType, ByVal price As PriceType) As Single
    Return 0
End Function
public float FindPriceForItem(string title, ItemType name, PriceType price)

避免将标志枚举值设置为零,除非该值用于指示所有标志都被清除。 应按照下一项准则中的说明正确地命名此类值。

注意,此项准则只适用于标志枚举。 简单枚举可以也应当使用零值。

将标志的零值命名为 None。 对于标志枚举,该值必须始终表示所有标志都被清除。

重要说明重要事项

不要使用标志枚举中的零值指示任何其他状态。无法检查是否显式设置了零值标志(与未设置标志相对)。

部分版权所有 2005 Microsoft Corporation。 保留所有权利。

部分版权所有 Addison-Wesley Corporation。 保留所有权利。

设计指引的详细信息,请参阅"框架设计准则: 公约、 成语和可重复使用的模式。网络图书馆"书 Krzysztof Cwalina 和布拉德 · 艾布拉姆斯,2005年艾迪生 - 韦斯利,发表。

请参见

概念

枚举设计

向枚举添加值

其他资源

类型设计准则

类库开发的设计准则