设计标志枚举
标志枚举用于屏蔽位域及执行按位比较。 在可以同时指定多个枚举值的情况下,它们是可使用的正确设计。 例如,可以任意组合 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年艾迪生 - 韦斯利,发表。