关闭

改善C#程序的157个建议(连载8)

发表于:2011-10-21 09:59

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:陆敏技    来源:51Testing软件测试网采编

  建议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 
  11. }

  设想一下ValueTemp的值会是什么?为了验证结果,我们来看这段代码的输出:

  1. Week week = Week.ValueTemp;  
  2. Console.WriteLine(week);  
  3. Console.WriteLine(week == Week.Wednesday);

  输出为:

Wednesday
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. class MyClass  
  14. {  
  15.     Week week = Week.Thursday | Week.Sunday;  
  16. }

相关链接:

改善C#程序的157个建议(连载1)

改善C#程序的157个建议(连载2)

改善C#程序的157个建议(连载3)

改善C#程序的157个建议(连载4)

改善C#程序的157个建议(连载5)

改善C#程序的157个建议(连载6)

改善C#程序的157个建议(连载7)

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号