枚举设计
枚举提供成组的常数值,它们有助于使成员成为强类型以及提高代码的可读性。 枚举分为简单枚举和标志枚举两种。 简单枚举包含的值不用于组合,也不用于按位比较。 标志枚举应使用按位 OR 操作进行组合。 标志枚举值的组合使用按位 AND 操作检查。
下列指南介绍了枚举设计的最佳做法。
一定要使用枚举强类型化参数、属性和表示值集的返回值。
一定要优选使用枚举而不是静态常量。
下面的代码示例演示了不正确的设计。
Public Class BadFurnishings
Public Shared Table As Integer = 1
Public Shared Chair As Integer = 2
Public Shared Lamp As Integer = 3
End Class
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
End Enum
public enum GoodFurnishings
{
Table,
Chair,
Lamp
}
不要对开放集(如操作系统版本)使用枚举。
向已提供的枚举添加值会中断现有代码。 有时可以接受这种做法,但不应在可能出现这种情况的场合设计枚举。
不要定义供将来使用的保留枚举值。
某些情况下,您可能认为为了向提供的枚举添加值,值得冒可能中断现有代码的风险。 还可以定义使用其值的新的枚举和成员。
避免公开只有一个值的枚举。
一定不要将 sentinel 值包括在枚举中。
Sentinel 值用于标识枚举中的值的边界。 通常,sentinel 值用于范围检查,它不是一个有效的数据值。 下面的代码示例定义一个带有 sentinel 值的枚举。
Public Enum Furniture
Desk
Chair
Lamp
Rug
LastValue
End Enum
public enum Furniture
{
Desk,
Chair,
Lamp,
Rug,
LastValue // The sentinel value.
}
一定要在简单枚举中提供一个零值。
如果可能,将此值命名为 None。 如果 None 不适合,请将零值赋给最常用的值(默认值)。
考虑将 System.Int32(大多数编程语言的默认数据类型)用作枚举的基础数据类型,除非出现以下任何一种情况:
枚举是标志枚举,且您有 32 个以上的标志或者期望在将来有更多的标志。
基础类型需要与 Int32 不同,以便易于与期望不同大小的枚举的非托管代码进行互操作。
较小的基础类型可以节省大量空间。 如果期望枚举主要用作控制流的参数,其大小就不太重要。 如果出现下面的情况,大小节省可能会很重要:
期望枚举被用作非常频繁地实例化的结构或类中的字段。
期望用户创建枚举实例的大型数组或集合。
预计要序列化大量枚举实例。
一定要以名词或名词词组的复数来命名标志枚举。 简单枚举应以单数的名词或名词词组命名。
不要直接扩展 System.Enum。
一些编译器不允许扩展 Enum,除非间接地使用生成枚举的语言特定的关键字来进行扩展。
部分版权所有 2005 Microsoft Corporation。 保留所有权利。
部分版权所有 Addison-Wesley Corporation。 保留所有权利。
设计指引的详细信息,请参阅"框架设计准则: 公约、 成语和可重复使用的模式。网络图书馆"书 Krzysztof Cwalina 和布拉德 · 艾布拉姆斯,2005年艾迪生 - 韦斯利,发表。