李晓亮的博客

导航

【摘】枚举设计

【本文自】http://msdn.microsoft.com/zh-cn/library/ms229058(VS.80).aspx

                 http://msdn.microsoft.com/zh-tw/library/sbbt4032.aspx

枚举设计

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

不要对开放集(如操作系统版本)使用枚举。

向已提供的枚举添加值会中断现有代码。有时可以接受这种做法,但不应在可能出现这种情况的场合设计枚举。

不要定义供将来使用的保留枚举值。

某些情况下,您可能认为为了向提供的枚举添加值,值得冒可能中断现有代码的风险。还可以定义使用其值的新的枚举和成员。

避免公开只有一个值的枚举。

一定不要将 sentinel 值包括在枚举中。

Sentinel 值用于标识枚举中的值的边界。通常,sentinel 值用于范围检查,它不是一个有效的数据值。下面的代码示例定义一个带有 sentinel 值的枚举。

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 库的约定、术语和模式》)。

请参见


 

 

posted on 2008-09-16 23:11  LeeXiaoLiang  阅读(206)  评论(0编辑  收藏  举报