建议8: 避免给枚举类型的元素提供显式的值

转载 2016年08月29日 20:38:53

建议8: 避免给枚举类型的元素提供显式的值

一般情况下,没有必要给枚举类型的元素提供显式的值。创建枚举的理由之一,就是为了代替使用实际的数值。不正确地为枚举类型的元素设定显式的值,会带来意想不到的错误。

如果为建议7中的枚举类型Week增加一个元素,代码如下所示:

  1. enum Week  
  2. {  
  3.     Monday = 1,  
  4.     Tuesday = 2,  
  5.     ValueTemp,  
  6.     Wednesday = 3,  
  7.     Thursday = 4,  
  8.     Friday = 5,  
  9.     Saturday = 6,  
  10.     Sunday = 7 

设想一下ValueTemp的值会是什么?为了验证结果,我们来看这段代码的输出:
  1. Week week = Week.ValueTemp;  
  2. Console.WriteLine(week);  
  3. Console.WriteLine(week == Week.Wednesday); 

输出为:
  1. Wednesday  
  2. True 

很遗憾,我们明明为Week赋值为ValueTemp,可是得到的结果却是Wednesday。

事实上,如果为枚举类型显式地赋过值,那么很有可能在下个版本中,你为了某些增加的需要,会为枚举添加元素,在这个时候,就像我们为Week增加元素ValueTemp一样,极有可能会一不小心增加一个无效值。

上一个建议中已经讲到如果没有为元素显式赋值,编译器会逐个为元素的值+1。当编译器发现元素ValueTemp的时候,它会自动在Tuesday = 2的基础上+1,所以,实际ValueTemp的值和Wednesday的值都是3。而枚举本身所包括的枚举元素都是值类型,所以产生了上面的输出。

从上面的例子我们应该已经注意到,枚举元素允许设定重复的值。所以,当我们看到下面这段代码的输出时,应该不会感到吃惊:

  1. enum Temp  
  2. {  
  3.     Value1 = 1,  
  4.     Value2 = 1 
  5. }  
  6.     private static void NewMethod2()  
  7.     {  
  8.         Temp temp1 = Temp.Value1;  
  9.         Temp temp2 = Temp.Value2;  
  10.         Console.WriteLine(temp1 == temp2);  
  11.         Console.WriteLine(temp1.Equals(temp2));  
  12.         Console.WriteLine(temp1.CompareTo(temp2));  
  13.         Console.WriteLine(temp1 == Temp.Value1);  
  14.         Console.WriteLine(temp1 == Temp.Value2);  
  15.     } 

输出为:
  1. True  
  2. True  
  3. 0  
  4. True  
  5. True 

注意 本建议也有例外。例如,当为一个枚举类型指定System.FlagsAttribute 属性时,就意味着可以对这些值执行 AND、OR、NOT 和 XOR 按位运算,这样一来,就要求枚举的每个元素的值都是 2 的若干次幂,指数依次递增。如Week的版本就应该为:
  1. [Flags]  
  2. enum Week  
  3. {  
  4.     None = 0x0,  
  5.     Monday = 0x1,  
  6.     Tuesday = 0x2,  
  7.     Wednesday = 0x4,  
  8.     Thursday = 0x8,  
  9.     Friday = 0x10,  
  10.     Saturday = 0x20,  
  11.     Sunday = 0x40 
  12. }  
  13.  
  14. class MyClass  
  15. {  
  16.     Week week = Week.Thursday | Week.Sunday;  
转自:《编写高质量代码改善C#程序的157个建议》陆敏技

浅谈使用单元素的枚举类型实现单例模式

简介 使用单元素的枚举实现单例模式简介通常情况下,我们写单例模式的时候无非就是三个步骤:构造器私有化,声明私有静态变量,提供静态获取实例的方法。简单说就是以下这种方式:class SingletonA...
  • huangyuan_xuan
  • huangyuan_xuan
  • 2016年08月12日 22:47
  • 5506

enum类型变量的使用和赋值

enum是枚举型 union是共用体,成员共用一个变量缓冲区现在基本已经不用了。 枚举类型 在实际问题中,有些变量的取值被限定在一个有限的范围内。例如,一个星期内只有七天,一年只有十二个月,一个...
  • maochengtao
  • maochengtao
  • 2015年06月23日 16:01
  • 23423

单元素枚举类实现单例模式

本文转载自:点击打开链接 Inspired by Effective Java. Singleton模式是在编程实践中应用最广泛的几种设计模式之一。以前知道的,实现单例的方法有两种(下...
  • see__you__again
  • see__you__again
  • 2016年06月03日 15:15
  • 1570

程序设计基础8_结构体共用体和枚举类型

  • 2016年01月28日 22:32
  • 2.42MB
  • 下载

8.C++ (结构体、共同体、枚举类型)

1.结构体、共同体、枚举类型
  • qq_34981632
  • qq_34981632
  • 2016年12月22日 15:42
  • 103

建议47:即使提供了显式释放方法,也应该在终结器中提供隐式清理

建议47:即使提供了显式释放方法,也应该在终结器中提供隐式清理 在标准的Dispose模式中,我们注意到一个以~开头的方法,如下: /// /// 必...
  • houwc
  • houwc
  • 2016年09月06日 17:44
  • 153

Java Design Demo--枚举类型--避免嵌套过多

我们在初学时用过if--else的语句,也用过switch,但是你会发觉如果嵌套过多代码可读性变差。 如以下我们写过通过分数给学生成绩评级,简写后的代码如下 A示例 public c...
  • b275518834
  • b275518834
  • 2013年01月01日 11:29
  • 2752

JAVA枚举类型复写ordinal和name值

持久层用hibernate实现,在实体和数据库映射的时候,字段设为枚举有两种方式: 1 2 3 @Enumerated(EnumType.STRING) @Column...
  • zhuliliang
  • zhuliliang
  • 2017年05月16日 10:40
  • 137

【C#】变量的定义,值、引用以及枚举类型详解说明

【变量的基本概念】 变量本身被用来存储在内存中的特定类型的数据,可以根据需要随时改变变量中所存储的数据值。 变量具有名称、类型和值。 变量名是变量在程序源代码中的标识。 变量类型确定它所代表的...
  • YunPro
  • YunPro
  • 2015年03月01日 16:25
  • 1175

java枚举类型enum值与整数的转换

java编程中偶尔会用到枚举,为了直观,我们通常将枚举值设置为形象的单词,方便理解和使用。枚举类型相当于数据库 中字典表,但是枚举只有字典表的值,缺少其他用来表示和值一一对应的字段,当我们在数据库中...
  • feinifi
  • feinifi
  • 2017年03月16日 14:29
  • 2476
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:建议8: 避免给枚举类型的元素提供显式的值
举报原因:
原因补充:

(最多只允许输入30个字)