【本文摘自】http://msdn.microsoft.com/zh-cn/library/ms229058(VS.80).aspx
http://msdn.microsoft.com/zh-tw/library/sbbt4032.aspx
枚举提供成组的常数值,它们有助于使成员成为强类型以及提高代码的可读性。枚举分为简单枚举和标志枚举两种。简单枚举包含的值不用于组合,也不用于按位比较。标志枚举应使用按位 OR 操作进行组合。标志枚举值的组合使用按位 AND 操作检查。
下列指南介绍了枚举设计的最佳做法。
一定要使用枚举强类型化参数、属性和表示值集的返回值。
一定要优选使用枚举而不是静态常量。
下面的代码示例演示了不正确的设计。
C#
|
public static class BadFurnishings { public static int Table = 1; public static int Chair = 2; public static int Lamp = 3; } |
下面的代码示例演示应使用来代替静态常量的枚举。
C#
|
public enum GoodFurnishings
{
Table,
Chair,
Lamp
}
|
不要对开放集(如操作系统版本)使用枚举。
向已提供的枚举添加值会中断现有代码。有时可以接受这种做法,但不应在可能出现这种情况的场合设计枚举。
不要定义供将来使用的保留枚举值。
某些情况下,您可能认为为了向提供的枚举添加值,值得冒可能中断现有代码的风险。还可以定义使用其值的新的枚举和成员。
避免公开只有一个值的枚举。
一定不要将 sentinel 值包括在枚举中。
Sentinel 值用于标识枚举中的值的边界。通常,sentinel 值用于范围检查,它不是一个有效的数据值。下面的代码示例定义一个带有 sentinel 值的枚举。
C#
|
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 和 Brad Abrams 编著、Addison-Wesley 于 2005 年出版的“Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries”(《框架设计指南:可重用 .NET 库的约定、术语和模式》)。
请参见