Uwe*_*amp 15 c# switch-statement
我想知道为什么C#要求我break在switch语句中使用,尽管根据定义不允许使用直通语义.因此,编译器可以生成break每个case块的末尾并省去麻烦.
但是,有一种情况(已在本网站上讨论过),我可以提出这可能是明确使用的原因break:
switch (foo) {
case 0:
case 1:
bar();
break;
default:
break;
}
Run Code Online (Sandbox Code Playgroud)
这里,bar()如果foo值为0或1 ,则调用该方法.
如果编译器自己生成break语句,那么这个选项会在最真实的意义上打破.这是它,这是为什么休息是强制性的还是有其他正当理由?
Eri*_*ert 39
这个问题预示着虚假,因此无法回答.该语言不需要在切换部分的末尾中断.该语言要求交换机部分的语句列表必须具有无法到达的端点."break"只是具有此属性的最常用语句.使用"return;","goto case 2;","throw new Exception();"结束切换部分是完全合法的.或"while(true){}"(或者在某些情况下,继续,但这通常是一个坏主意.)
我们要求具有无法访问端点的语句列表的原因是强制执行"不通过"规则.
如果你的问题更好地陈述为"为什么当我无法生成带有无法到达终点的语句列表的交换机部分时,编译器会自动修复我的错误,通过为我插入break语句?",那么答案是C#不是"猜测开发人员可能意味着什么,并通过某种语言混淆.有些语言是 - 例如JScript - 但C#不是.
我们认为犯错的C#程序员希望被告知这些错误,以便他们能够故意和刻意地纠正错误,这是一件好事.我们的客户告诉我们,他们不希望编译器猜测他们的意思并希望最好.这就是为什么C#也不会像JScript那样猜测丢失分号的位置,或者当你试图像JScript那样修改只读变量时静默失败,等等.
LBu*_*kin 34
我怀疑C#要求开发人员在每个案例结尾处放置一个break或terminal语句的原因是为了清楚起见.
它避免了语言的新手假设C#中的switch()表现得像C或C++中的switch,其中发生了直通行为.只有在相邻空案例的情况下才会在C#中发生 - 这是相对明显的.
编辑:实际上,在C#中,fallthrough始终是非法的.然而,合法的是将一个案例与两个或多个标签相关联.Eric Lippert详细讲述了这种行为以及它与C/C++ switch语句的区别.
你可能有兴趣在阅读这篇文章埃里克Lipperts博客.
通过使break可选,你可以打开这样的bug:
switch (thing_result)
{
case GOOD_THING:
IssueReward();
// UH-OH, missing break!
case BAD_THING:
IssuePunishment();
break;
}
Run Code Online (Sandbox Code Playgroud)
C#语言设计者试图帮助程序员避免使用它之前的语言中的陷阱,通常是通过强制程序员更加明确(例如显式使用'override'或'new'关键字来实现或隐藏虚拟成员).