ASP.NET Lab

The Best Web, The Best Future

博客园 首页 新随笔 订阅 管理

标记枚举被用来屏蔽位字段并且完成位比较操作。它们被正确设计并在同时能够指定多个枚举值的时候被使用。例如,你可以对任何 GenericUriParserOptions 枚举值进行组合来配置一个常规的统一资源标识符(URI)处理器。

把 System.FlagsAttribute 应用到标记枚举。并且不要把这个特性应用到简单的枚举。
为标记枚举的值使用二幂,因此它们能够使用位操作运算符 OR 而自由地被组合。

重要提示:如果你不使用二幂或者二幂的组合,那么位比较操作将无法正确地被完成。

考虑为被使用的公共标记组合而提供特殊的枚举值。

标记枚举值的组合是一个中性技巧,不应该是开发者实现公共开发情节时所必需的。例如,FileShare 枚举包含了 ReadWrite 值来指定一个被共享的文件能够通过读取或写入的方式被打开。这说明了开发者能够通过读取或写入的方式来打开被共享的文件,并且排除了他们学习如何与一个单独的值一样来指定一个枚举的组合值的需要。

避免在出现某些值的无效组合的时候创建标记枚举。

这个问题典型地说明了枚举并不是十分准确的。考虑把枚举区分到两个或更多的枚举中去,每个都拥有一个更加准确的值集合。例如,考虑下列枚举的恶劣定义。

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

设计者还打算把这个枚举与下列方法一起使用。

public float FindPriceForItem(string title, PurchaseTypes purchase)

在调用这个方法的时候,purchase 参数正确地指定了一个 SalePrice 或 RegularPrice 的值以及一个正确的 Book 或 CompactDisk 值。那么,开发者将无法在不咨询文档或对这个方法进行试验的情况下来检测这个需求。一种更好的方式就是把这两种信息进行分离,并把它们分别存放到各自的枚举中,如下代码范例所示。

public enum ItemType
{
    Book,
    CompactDisk
}

public enum PriceType
{
    SalePrice,
    RegularPrice,
}

现在这个方法的签名将被改变以反映出重新所作的设计,如下代码范例所示。

public float FindPriceForItem(string title, ItemType name, PriceType price)
避免把一个标记枚举的值设置成零,除非这个值被用来表示所有的标记都是被清除的。类似于这样的一个值应该与下一个指导方针中被描述的一样适当地进行命名。

注意这个指导方针只适用于标记枚举。而简单的枚举能够并且只能够使用零值。

把标记枚举的零值命名为 None。至于一个标记枚举,该值必须始终都能够表示所有的标记都是被清除的。

重要提示:不要在标记枚举中使用零值来表示任何其他的状态。因为还没有一种方式能够对标记的零值是否被明确地设置而进行检查,这种情况与被反对的无标记设置一样。

posted on 2007-01-29 20:10  Laeb  阅读(367)  评论(0编辑  收藏  举报