建议8: 避免给枚举类型的元素提供显式的值
来源:互联网 发布:程序员视频教程 编辑:程序博客网 时间:2024/05/29 03:26
建议8: 避免给枚举类型的元素提供显式的值
一般情况下,没有必要给枚举类型的元素提供显式的值。创建枚举的理由之一,就是为了代替使用实际的数值。不正确地为枚举类型的元素设定显式的值,会带来意想不到的错误。
如果为建议7中的枚举类型Week增加一个元素,代码如下所示:
设想一下ValueTemp的值会是什么?为了验证结果,我们来看这段代码的输出:
- enum Week
- {
- Monday = 1,
- Tuesday = 2,
- ValueTemp,
- Wednesday = 3,
- Thursday = 4,
- Friday = 5,
- Saturday = 6,
- Sunday = 7
- }
输出为:
- Week week = Week.ValueTemp;
- Console.WriteLine(week);
- Console.WriteLine(week == Week.Wednesday);
- Wednesday
- True
很遗憾,我们明明为Week赋值为ValueTemp,可是得到的结果却是Wednesday。
事实上,如果为枚举类型显式地赋过值,那么很有可能在下个版本中,你为了某些增加的需要,会为枚举添加元素,在这个时候,就像我们为Week增加元素ValueTemp一样,极有可能会一不小心增加一个无效值。
上一个建议中已经讲到如果没有为元素显式赋值,编译器会逐个为元素的值+1。当编译器发现元素ValueTemp的时候,它会自动在Tuesday = 2的基础上+1,所以,实际ValueTemp的值和Wednesday的值都是3。而枚举本身所包括的枚举元素都是值类型,所以产生了上面的输出。
从上面的例子我们应该已经注意到,枚举元素允许设定重复的值。所以,当我们看到下面这段代码的输出时,应该不会感到吃惊:
输出为:
- enum Temp
- {
- Value1 = 1,
- Value2 = 1
- }
- private static void NewMethod2()
- {
- Temp temp1 = Temp.Value1;
- Temp temp2 = Temp.Value2;
- Console.WriteLine(temp1 == temp2);
- Console.WriteLine(temp1.Equals(temp2));
- Console.WriteLine(temp1.CompareTo(temp2));
- Console.WriteLine(temp1 == Temp.Value1);
- Console.WriteLine(temp1 == Temp.Value2);
- }
注意 本建议也有例外。例如,当为一个枚举类型指定System.FlagsAttribute 属性时,就意味着可以对这些值执行 AND、OR、NOT 和 XOR 按位运算,这样一来,就要求枚举的每个元素的值都是 2 的若干次幂,指数依次递增。如Week的版本就应该为:
- True
- True
- 0
- True
- True
- [Flags]
- enum Week
- {
- None = 0x0,
- Monday = 0x1,
- Tuesday = 0x2,
- Wednesday = 0x4,
- Thursday = 0x8,
- Friday = 0x10,
- Saturday = 0x20,
- Sunday = 0x40
- }
- class MyClass
- {
- Week week = Week.Thursday | Week.Sunday;
- }
转自:《编写高质量代码改善C#程序的157个建议》陆敏技
0 0
- 建议8: 避免给枚举类型的元素提供显式的值
- 建议8 避免给枚举类型的元素提供显式的值
- Tip8 避免给枚举类型的元素提供显示的值
- 给创始人的建议:需要避免的常见创业陷阱
- 给HUSTOJ用户提供的源码阅读与修改建议
- C#遍历枚举类型的所有元素
- 避免死锁的建议
- 避免频繁输入sudo,给普通用户提供root权限,并只需提供自己的密码
- 遍历枚举元素的值
- 建议125:避免用FCL的类型名称命名自己的类型
- MySQL提供IP转换函数,对于IP类型的地址,建议使用int类型存储
- XML 命名空间提供了一种避免元素命名冲突的方法。
- 单元素的枚举类型实现单例
- 给CSDNBlog的建议
- 给CSDN的建议
- 给JHX的建议
- 给初学者的建议
- 给虾米的建议
- POJ 2531 - Network Saboteur
- LeetCode(383)Ransom Note
- 【BZOJ2844】albus就是要第一个出场,线性基
- leetcode_389 Find the Difference
- Opencv中的Mat类使用方法总结
- 建议8: 避免给枚举类型的元素提供显式的值
- 质数筛选--快速筛选出小于等于N的质数
- Android0828(二)
- 使用springmvc拦截器进行登录控制
- Java环境变量配置
- struct在C和C++中的区别
- 文章标题
- 几篇不错的文章
- typeof、instanceof和contructor的使用