Share via


枚举设计

枚举提供成组的常数值,它们有助于使成员成为强类型以及提高代码的可读性。 枚举分为简单枚举和标志枚举两种。 简单枚举包含的值不用于组合,也不用于按位比较。 标志枚举应使用按位 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年艾迪生 - 韦斯利,发表。

请参见

概念

设计标志枚举

向枚举添加值

其他资源

类型设计准则

类库开发的设计准则