我想知道为什么C#要求我在break
语句中使用switch
,尽管根据定义不允许使用连贯语义。因此,编译器可以在每个break
块的末尾生成case
并节省麻烦。
但是,有一种情况(已在本网站上讨论过),我可以提出这可能是明确使用break
的原因:
switch (foo) {
case 0:
case 1:
bar();
break;
default:
break;
}
如果bar()
的值为0或1,则调用方法foo
。
如果编译器本身会生成break
语句,那么这个选项会在最真实的意义上打破。是这样,这是为什么休息是强制性的还是有其他正当理由?
答案 0 :(得分:38)
这个问题预示着虚假,因此无法回答。该语言不需要在切换部分的末尾中断。该语言要求交换机部分的语句列表必须具有无法到达的端点。 “break”只是具有此属性的最常用语句。使用“return;”,“goto case 2;”,“throw new Exception();”结束切换部分是完全合法的。或“while(true){}”(或者在某些情况下,继续,但这通常是一个坏主意。)
我们要求具有无法访问端点的语句列表的原因是强制执行“不通过”规则。
如果您的问题更好地说明为“当我无法生成带有无法到达终点的语句列表的交换机部分时,为什么编译器不能自动修复我的错误,通过为我插入break语句?”,然后答案是C#不是“猜测开发人员可能意味着什么并且通过某种语言混淆”。有些语言是 - 例如JScript - 但C#不是。
我们认为犯错误的C#程序员希望被告知这些错误,以便他们能够故意和刻意地纠正错误,这是一件好事。我们的客户告诉我们,他们不希望编译器猜测他们的意思并希望最好。这就是为什么C#也不会像JScript那样猜测丢失分号的位置,或者当你试图像JScript那样修改只读变量时静默失败,等等。
答案 1 :(得分:33)
我怀疑C#要求开发人员在每个案例结尾处放置一个中断或终止声明的原因是为了清楚起见。
它避免了语言的新手假设C#中的switch()表现得像C或C ++中的switch,其中发生了直通行为。 只有在相邻空案例的情况下才会在C#中发生 - 这是相对明显的。
编辑:实际上,在C#中,fallthrough始终是非法的。然而,合法的是将一个案例与两个或多个标签相关联。 Eric Lippert writes at length about this行为and how it differs from C/C++ switch statements。
您可能有兴趣阅读Eric Lipperts博客上的this article。
答案 2 :(得分:5)
通过使break成为可选,你可以打开这样的错误:
switch (thing_result)
{
case GOOD_THING:
IssueReward();
// UH-OH, missing break!
case BAD_THING:
IssuePunishment();
break;
}
C#语言设计人员试图帮助程序员避免使用它之前的语言中的陷阱,通常是通过强制程序员更加明确(例如显式使用'override'或'new'关键字来实现或隐藏虚拟成员)。
答案 3 :(得分:0)
我对此问题的理解是它包含在内以匹配C ++语法。
答案 4 :(得分:0)
如果您不需要添加休息时间,则会出现问题
switch (number)
{
case 0:
case 1:
DoSomething();
}
如果number == 0会怎样?这是一个没有做任何事情的空案例,还是会执行DoSomething()?