在这种情况下,我需要“默认”语句吗?

用户名

通常在学校,我们的讲师会告诉我们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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Go:在这种情况下需要频道吗?

在这种情况下真的需要 FlexibleContexts 吗?

在这种情况下,我该如何缩短if语句?

在这种情况下,我真的需要两张桌子吗?

在这种情况下,我真的需要实现迭代器吗?

我需要在这种情况下创建片段吗?

在这种情况下,我需要实施全文搜索吗?备择方案?

我可以在这种情况下使用枚举吗?

在这种情况下我必须删除内存吗?

在这种情况下我应该检查指针吗?

在这种情况下,我们需要禁用默认的复制构造函数并分配运算符?

什么时候使用await关键字?在这种情况下我需要它吗?

C#“使用”语句后跟try语句在这种情况下可以忽略括号吗?

在这种情况下,Python 3不需要__init__.py吗?

在这种情况下,我的Switch语句应该以break退出还是返回x?

在这种情况下,我如何为 COUNT 重写正确的语句

在这种情况下,我真的需要使用另一个模板

为什么在这种特殊情况下我不需要模板参数?

为什么在这种情况下我需要评估lambda

了解为什么在这种情况下我需要parseInt()

在这种情况下,我需要Web服务还是Hessian?

为什么我需要在这种情况下使用 ravel()?

为什么在这种情况下需要引用/借用?

在这种情况下是否需要 UpdateSourceTrigger=PropertyChanged?

在这种情况下是否需要关闭文件?

在这种情况下,是否需要InnoDB?

在这种情况下,需要标记子类型-Ada

为什么在这种情况下需要ref?

python argparse在这种情况下有解决方案吗?在这种情况下,我们有未知的参数名称,需要将它们与值匹配?