首页 > .NET 指南:枚举的设计

.NET 指南:枚举的设计

枚举提供了为强类型成员所用的常量值集合并且改进了代码可读性。枚举既可以是简单的也可以是标记。简单的枚举包含了没有在位比较操作中被组合或被使用的值。而标记枚举则是通过使用位比较操作关键字 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 进行扩展,除非你在生成枚举的时候间接地使用了特定的语言关键词。

转载于:https://www.cnblogs.com/Laeb/archive/2007/01/29/633849.html

更多相关:

  •    新手入门:C/C++中枚举类型(enum)   如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型。之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来。   举个例子来说明一吧,为了让大家更明白一点,比如一个铅笔盒中有一支笔,但在没有打开之前你并不知道它是什么笔,可能是铅笔也可能是钢笔...

  • 默认情况下,枚举第一个值是0, 可显式为枚举赋值。 可以定义枚举的基础类型,如enum E : short {}, sizeof(E) == 2;默认情况下是int。 枚举的继承链:ValueType->Enum->enum 枚举类型和基础类型之间的转换都是显式的,0除外,因为存在从0代任何枚举类型的隐式转换。 枚举的ToStrin...

  • 原文出处: 韩昊    1 2 3 4 5 6 7 8 9 10 作 者:韩 昊 知 乎:Heinrich 微 博:@花生油工人 知乎专栏:与时间无关的故事   谨以此文献给大连海事大学的吴楠老师,柳晓鸣老师,王新年老师以及张晶泊老师。   转载的同学请保留上面这句话,谢谢。如果还能保留文章来源就更感激不尽了。 我保证这篇文章...

  • 原文出处: 韩昊   我保证这篇文章和你以前看过的所有文章都不同,这是 2012 年还在果壳的时候写的,但是当时没有来得及写完就出国了……于是拖了两年,嗯,我是拖延症患者…… 这篇文章的核心思想就是: 要让读者在不看任何数学公式的情况下理解傅里叶分析。 傅里叶分析不仅仅是一个数学工具,更是一种可以彻底颠覆一个人以前世界观的思维...

  • 很多Linux高手都喜欢使用screen命令,screen命令可以使你轻松地使用一个终端控制其他终端。尽管screen本身是一个非常有用的工具,byobu作为screen的增强版本,比screen更加好用而且美观,并且提供有用的信息和快捷的热键。 想象一下这样一个场景:你通过Secure Shell(ssh)链接到一个服务器,并...

  • NarrowbandPrimary Synchronization Signal时域位置每1个SFN存在一个NPSSSFNSubframeSymbol长度每个SFN5最后11个symbol11个symbols频域位置NB-IOT下行带宽固定180kHz,一个PRB,12个子载波。...

  •  [h1]反斜杠只能够阻止一个字符  [h2]位于键盘的左上角,和~公用一个键。...

  • nan 是not a number ,inf是无穷大 numpy.nan_to_num(x): 使用0代替数组x中的nan元素,使用有限的数字代替inf元素...

  • 简介 Simple Reference  基础CUDA示例,适用于初学者, 反映了运用CUDA和CUDA runtime APIs的一些基本概念.Utilities Reference  演示如何查询设备能力和衡量GPU/CPU 带宽的实例程序。Graphics Reference  图形化示例展现的是 CUDA, OpenGL,...

  • 在做开发的过程中难免需要给内核及下载的一些源码打补丁,所以我们先学习下Linux下使用如如何使用diff制作补丁以及如何使用patch打补丁。...

  • 我在调研ATS 4.2.3挂载SSD的过程中,遇到很多坑,特此详细记录我摸索的主要过程,以便大家以后避免之。 基本思路可以完全照搬参考文献[2][3] 下面的安装假定是以root用户身份进行的,Linux服务器已经安装好系统,磁盘已经做好分区。 首先需要认识我们的Linux服务器的硬件配置和软件情况 硬件配置: DELL...

  • 该博文整理一些在使用stl编程过程中遇到的小经验: 1.在多线程环境下面打印调试,如何使用cout及时刷新到屏幕上? 在C中我们经常这样使用: printf("Hello World "); fflush(stdout); 如果使用stl,我们可以这样使用: cout << "Hello World" << endl <...