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
结尾的?>
文件进行比较。我从来没有以?>
结尾,主要是因为有输出空白的风险,但有人可能会说以文件结尾是合乎逻辑的事情。#1 楼
在最后一个替代方案之后,在技术上不需要break
(请记住,不必是default
:这是完全合法的,有时甚至将default
分支放在首位也很有用);无论您的代码是通过switch
语句的末尾还是通过breaks
在其最后一个分支的末尾掉落,都具有相同的结果。但是,我仍然会结束每个分支,包括最后一个分支,一个
return
或break
语句,其原因有三个:可重构性。如果所有分支均以
break
或return
结尾,则可以在不更改含义的情况下对其重新排序。这使得这种重新排序不太可能引入回归。一致性和最小惊喜。一致性表示分支机构应一致结束,除非它们的含义实际上不同。最少惊奇原则规定相似的事物看起来应该相似。完全像前面的一样结束
switch
块的最后一个分支,可以同时满足这两个条件,这使阅读和理解更加容易。如果您忽略了显式的break
,则最后一个分支在视觉上会有所不同(这对于快速扫描尤为重要),并且为了看到它确实没有什么不同,阅读器必须下降到阅读单个对象的基本水平声明。保护自己。如果您习惯以
switch
结束所有break
分支,则一段时间后它会自动变为自动,并且您不太可能在重要的地方意外忘记它。培训自己以期望每个分支末尾都有break
,这也有助于检测丢失的break
语句,这对于调试和疑难解答非常有用。#2 楼
鉴于在大多数语言中围绕使用switch-case
存在歧义性,因此我建议始终使用break
语句,除非明确地和设计上不希望使用它。部分原因是因为使每个
case
调用看起来都相同,我认为这将提高可读性。但这也意味着,如果有人(甚至您)选择在稍后的最后一个命令之后插入case
,则他们不必担心检查先前的块,这可以帮助减少添加新代码时的错误。 />评论
当我想让一个案例进入下一个案例时(这不是case foo的退化案例:case bar:...),我在其中提出了一个明确的注释,希望发生这种情况。使它更加清晰。
–研究员
13年6月17日在18:18
是的,就像一个简单的注释//没有中断代替中断;
–起搏器
13年10月8日在12:10
如果是C ++,则为[[fallthrough]]属性。
–俄罗斯
18-2-22在13:03
#3 楼
在最后一种情况之后,不需要break
。我使用“ last”一词(不是默认值),因为没有必要使用默认情况下的最后一种情况。switch(x)
{
case 1:
//do stuff
break;
default:
//do default work
break;
case 3:
//do stuff
}
我们知道,两个之间必须有一个
break
连续case
s。有时,当其他人引用我的代码时,我在代码中使用if(a!=0)
可以提高可读性。我可以选择使用if(a)
,这将由我选择评论
对我而言,这意味着“总是使用中断”,以防万一某些程序员在切换结束时添加了新的情况而没有检查中断是否确实存在(这是程序员的错,但最好还是安全的-如果任何原因,因为您可能在6个月内成为该程序员-)
– SJuan76
2013年6月17日9:41
@ SJuan76是的,我同意,比后悔要安全得多,如果您想保护将来的错误,请在末尾添加一个。
– Suvarna Pattayil
13年6月17日在9:43
考虑到该参数,您还可以争辩说,如果插入新值,则在数组末尾始终具有。但是,这会破坏一些代码,并且通常看起来很丑陋:)
–罗宾·卡斯特林
2013年6月17日9:56
@Robin放入逗号是不同的。如果它不存在,并且有人将新值添加到数组,那么他们将得到编译错误。但是,如果前一个case语句缺少中断,则不会出现编译错误-因此,很可能会丢失该错误并导致运行时错误。
–基思·米勒(Keith Miller)
2013年6月17日10:19
@RobinCastlin提供的语言允许您输入。万一,默认情况下被设计为最后一种情况。也许语言会认为将其作为错误之后的中断。假设只有在两种情况下才允许中断作为区分因素。
– Suvarna Pattayil
2013年6月17日上午10:23
评论
感谢您对此的见识!也将打破最后一种情况:)
–罗宾·卡斯特林
13年6月17日在11:50
在C#中,从技术上讲,在最后一种选择之后,需要break(或退出该案例的其他控制流语句)。
– dan04
2013年6月17日15:43
@ dan04:是的,很好。 C#在这里是一个例外,这可能是因为语言设计人员知道现有语言中的切换失败问题,并希望防止这些问题。 C#施加的规则与我的答案中的建议非常匹配。
– tdammers
2013年6月17日20:10
您在说什么语言? C? C ++? C#? Java的? PHP的?
– svick
2013年6月20日19:18
一个好的编译器会将最后的中断视为NO-OP,而不是为下一条指令生成jmp,对吗?
–内森·奥斯曼(Nathan Osman)
13年7月15日在19:06