通常在学校,我们的讲师会告诉我们Default
在转换案例声明的末尾始终要包含一个声明。但是,我一直想知道所有(或大多数)方案是否有必要?
考虑一下C ++中的以下示例:
int num = rand()%3;
switch (num)
{
case 0: methodOne();
break;
case 1: methodTwo();
break;
case 2: methodThree();
break;
}
在上述情况下,我觉得不可能有> 2或<0的情况,所以我还需要包含一条Default
语句吗?
SO中也有类似的问题,要求Default
在开关情况下使用。那里给出的答复表明,我们几乎应该在任何时候都包含一个Default
。但是在我个人遇到的所有情况下,这似乎是多余的,因为Default
永远无法实现。
编辑:另外,在防御性编程方面,这种情况是否需要Default
声明?如果我要添加一个Default
声明。这只是一个error-handling
陈述,我是否可以这么说?
从技术上讲,不,您不需要,因为您已在switch语句中涵盖了所有可能的情况。
但是,无论如何,我总是发现在默认值中包含一个断言/异常很有用。请考虑以下情形:
// V1.0.0: Initial version.
int num = rand()%3;
switch (num)
{
case 0: methodOne();
break;
case 1: methodTwo();
break;
case 2: methodThree();
break;
}
之后...
// V1.0.0: Initial version.
// V1.0.1: Added a fourth method.
int num = rand()%4;
switch (num)
{
case 0: methodOne();
break;
case 1: methodTwo();
break;
case 2: methodThree();
break;
}
在这种情况下,开发人员#2更新了rand
模数,但实际上没有将大小写添加到handle num == 4
。没有default
,您将无声无息地失败,并且可能导致各种不良情况,这些不良情况很难调试。更具可维护性的解决方案可能是:
// V1.0.0: Initial version.
// V1.0.1: Added a fourth method.
int num = rand()%4;
switch (num)
{
case 0: methodOne();
break;
case 1: methodTwo();
break;
case 2: methodThree();
break;
default:
assert(false);
throw InvalidNumException("BUG: Method has not been specified for value of num");
}
调试时,这将使调试器停止在断言状态,并且如果(上帝禁止)这种丢失case
使调试器一直投入生产,则将引发异常,而不是仅仅运行并执行不应发生的事情。
编辑:
我认为包括全面防护是防御性编程风格的一个很好的补充。它保证了如果您错过一条case
语句,您将获得有用的结果(即使有用的结果是导致程序崩溃)。
编辑2:
正如Andre Kostur在对此答案的评论中提到的那样,如果您打开枚举并忘记处理a case
,则某些编译器将发出警告,这是不包括default
枚举switch语句大小写的一个很好的理由。有关更多信息,请参阅Phresnel的答案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句