购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

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

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

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


enum Week

{

Monday=1,

Tuesday=2,

ValueTemp,

Wednesday=3,

Thursday=4,

Friday=5,

Saturday=6,

Sunday=7

}


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


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);

}


输出为:


True

True

0

True

True


注意 本建议也有例外。例如,当为一个枚举类型指定System.FlagsAttribute属性时,就意味着可以对这些值执行AND、OR、NOT和XOR按位运算,这样一来,就要求枚举的每个元素的值都是2的若干次幂,指数依次递增。如Week的版本就应该为:


[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;

} Wu0v5JJerwgBQ8qLC3I++AG/6oT6r5aZ2YSvYsLh4HDvi9g4qEjdhCPeay0/Ehsu


点击中间区域
呼出菜单
上一章
目录
下一章
×

打开