枚举提供了为强类型成员所用的常量值集合并且改进了代码可读性。枚举既可以是简单的也可以是标记。简单的枚举包含了没有在位比较操作中被组合或被使用的值。而标记枚举则是通过使用位比较操作关键字 OR 而有意被组合的。通过使用位比较操作关键字 AND 还可以对标记枚举的组合值进行检查。
下列指导方针描述了枚举设计时的最佳实践。
为强类型参数、属性,以及呈现值集合的返回值而使用枚举,
赞成使用枚举来替代静态常量。
下列代码范例示范了错误的设计。
public static class BadFurnishings {public static int Table = 1;public static int Chair = 2;public static int Lamp = 3; }
下列代码范例示范了应该在静态常量空间中被使用的枚举。
public enum GoodFurnishings {Table,Chair,Lamp }
不要为开放的集合(如操作系统版本号)而使用枚举。
为已经被承载的枚举添加值能够破坏现有的代码。虽然在有些时候这样做是可以被接受的,但是你还是不应该在与此相同的情况下设计一个枚举。
不要定义为了将来的使用而被扩展的枚举值。
在有些情况下你可能会决定为被承载的枚举中添加值,但是这样做存在着可能破坏现有代码的风险。但是你同样可以定义一个新的枚举和成员来与它的值一起运作。
避免公开地暴露只有一个值的枚举。
不要在枚举中包括哨位值。
哨位值被用来对枚举值的分界进行识别。通常一个哨位值是在范围检查中被使用并且不是一个有效的数据值。下列代码范例定义了一个包含哨位值的枚举。
public enum Furniture {Desk,Chair,Lamp,Rug,LastValue // 这就是哨位值。 }
在简单的枚举中提供一个为零的值。
如果可能,把值命名成 None。如果名称 None 不太适合,就把零值指派到大多数公共地被使用的值中(默认时是这样)。
考虑把 System.Int32(在大多数编程语言中的默认数据类型)当作枚举的基本数据类型来使用,除非符合下列情况中的任何一种:
- 枚举是一个标记枚举,并且你有多于 32 个的标记或是在将来还会有更多标记的情况下。
- 基本类型需要不同于 Int32 才能够更容易地与非托管代码进行互操作,除非是不同尺寸的枚举。
一个更小的基本类型将会导致实质性的空间储存。如果你期望一个枚举被主要用来作为一个流向控件的参量,那么就可以稍微调整一下尺寸的变化。另外,尺寸储存还有可能是有意义的:
- 你期望这个枚举在一个频繁被例示的结构或类中当作一个字段被使用。
- 你期望用户创建庞大的枚举实例数组或集合。
- 你期望一个庞大数量的枚举实例能够被序列化。
以复数名词或名词短语来命名标记枚举。简单的枚举应该是以单数名词或名词短语来命名的。
不要直接对 System.Enum 进行扩展。
有些编译器不允许你对 Enum 进行扩展,除非你在生成枚举的时候间接地使用了特定的语言关键词。