中断默认情况下的开关


88

break常常不愿在最后一个案例之后加上或不包括在内default

switch (type) {
    case 'product':

        // Do behavior

        break;
    default:

        // Do default behavior

        break; // Is it considered to be needed?
}

break我的唯一目的是阻止代码在其余的switch-case中运行。

那么,break由于一致性而导致的最后一个是否更合乎逻辑,或者由于不break进行任何功能性使用而跳过了它是否更合逻辑?我认为两者在逻辑上都是不同的。

这可以在某种程度上与以结尾的.php文件进行比较?>。我?>之所以从不结束,主要是因为有输出空白的风险,但有人可能会认为以文件结尾是合乎逻辑的事情。

Answers:


144

break在最后一种选择之后,从技术上讲是不需要的(记住,不必这样default:这是完全合法的,有时甚至把default分支放在首位也很有用);无论您的代码是通过switch语句结尾还是breaks在其最后一个分支结尾处,结果都相同。

但是,出于三个原因,我仍然会用returnor break语句结束每个分支,包括最后一个分支:

  1. 重构能力。如果所有分支均以break或结尾return,则可以在不更改含义的情况下对其重新排序。这使得这种重新排序不太可能引入回归。
  2. 一致性和最小惊喜。一致性表示分支机构应一致结束,除非它们的含义实际上不同。最少惊奇原则规定相似的事物看起来应该相似。switch完全像前面的一样结束一个块的最后一个分支,可以同时满足这两个要求,这使阅读和理解更加容易。如果您忽略显式break,则最后一个分支在视觉上会有所不同(这对于快速扫描尤为重要),并且为了确保它确实没有什么不同,读者必须下降到阅读单个语句的实质层次。
  3. 保护自己。如果您习惯switch用a 结束所有分支break,则一段时间后它会自动出现,并且您不太可能在重要的地方意外忘记它。训练自己以期望break每个分支的结尾也有助于检测丢失的break语句,这对于调试和故障排除非常有用。

感谢您对此的见识!请问break最后一个案件:)
罗宾·卡斯特林

7
在C#, break(或离开其他控制流语句case作为最后的选择后在技术上需要的。
dan04 2013年

3
@ dan04:是的,很好。C#在这里是个例外,这可能是因为语言设计者知道switch现有语言存在的问题,并希望防止这些问题。C#施加的规则与我的答案中的建议非常匹配。
tdammers 2013年

您在说什么语言?C?C ++?C#?Java的?PHP的?
svick

2
一个好的编译器会将最终代码break视为NO-OP,而不是生成jmp下一条指令,对吗?
内森·奥斯曼

11

鉴于switch-case大多数语言在使用中都存在歧义,因此在使用它时,我建议始终使用一条break语句,除非明确声明并故意不使用它。

在某种程度上,这是因为使得每个case调用看起来都一样,我认为这将提高可读性。但这也意味着,如果某个人(甚至您)选择case在稍后的步骤中在最后一个之后插入一个,则他们不必担心检查先前的块,这可以帮助减少添加新代码时的错误。


7
当我想让一种情况适用于下一种情况(不是的简并的情况case foo: case bar: ...)时,我要明确指出,我希望发生这种情况。使它更清晰。
Donal Fellows 2013年

3
是的,就像一个简单的评论// no break代替break;
Pacerier,2013年

[[fallthrough]]如果是C ++,则为属性。
Ruslan '18

1

最后一种情况break之后没有必要。我使用“ last ” 一词(不是default),因为没有必要使用default case是last case。

switch(x)
{
case 1:
//do stuff
break;

default:
//do default work
break;

case 3:
//do stuff

}

而且我们知道,break 两个连续cases 之间必须有一个a 。有时,if(a!=0)当别人引用我的代码时,我会在代码中使用以提高可读性。我可以选择使用if(a),这将由我选择


5
对我来说,这意味着“总是使用中断”,以防万一某些程序员case在您的末尾添加了一个新代码switch而没有检查是否break确实存在(这是该程序员的错,但最好还是安全的-如果出于任何原因,因为您可能会在6个月内
成为一名

@ SJuan76是的,我同意,比后悔要安全得多,如果您想保护将来的错误,请在末尾添加一个。
Suvarna Pattayil 2013年

1
考虑到该参数,您还可以争辩说, ,如果插入新值,则总是在数组末尾。但是,这会破坏一些代码,并且通常看起来很丑陋:)
Robin Castlin 2013年

1
@Robin放入逗号是不同的。如果它不存在,并且有人将新值添加到数组,那么他们将得到编译错误。但是,如果前一个case语句缺少中断,则不会出现编译错误-因此,很可能会丢失该错误并导致运行时错误。
基思·米勒

@RobinCastlin提供的语言允许您输入,default万一,被设计为最后一种情况。也许语言会认为break后面的a错误。假设break只允许在两种情况下进行区分。
Suvarna Pattayil 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.