switch枚举时,要不要把枚举的每个值都写进case里?

我有一个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共享

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值