我有一个MyEnum
enum MyEnum
{
One,
Two,
Three
}
MyEnum的值不同,软件就做不同的事。
private static void AllCases()
{
MyEnum me = (MyEnum) new Random().Next(3);
switch (me)
{
case MyEnum.One:
Console.WriteLine(1);
break;
case MyEnum.Two:
Console.WriteLine(2);
break;
case MyEnum.Three:
Console.WriteLine(3);
break;
}
}
上面这段代码指定了3个case标签,对应MyEnum的3个值,没有default标签。还有另一种写法,就是省略某个case标签,代之以default标签。
private static void CasesAndDefault()
{
MyEnum me = (MyEnum)new Random().Next(3);
switch (me)
{
case MyEnum.One:
Console.WriteLine(1);
break;
case MyEnum.Two:
Console.WriteLine(2);
break;
default:
Console.WriteLine(3);
break;
}
}
上面这两种写法,那种更好呢?
从扩展性和枚举的意义上考虑,如果该枚举类型可能增加新的成员,则应该使用case语句(,还可以写上default标签,并抛出NotImplementedException,以防枚举增加了新值,case标签忘了加)。
如果是不会增加新成员的枚举,如星期几,那用哪种写法呢?
我这回从IL角度分析,将上面两段代码从IL反编译,得到如下两段代码。
可以发现,两段代码只有switch指令和其后的一个指令不同,写出所有case语句(AllCases)的代码比留一个case,改为default(casesAndDefault)多一点。
所以,当您考虑了写不写default标签的其他情况,仍无法作出决定时,可以参考本文,我建议选择写default,省略一个case。
爱让一切都对了
本文依照知识共享-署名-相同方式3.0共享