为什么我需要使用rest?

我想知道为什么C#要求我在switch语句中使用break ,尽管根据定义不允许使用fall-through语义。 因此,编译器可以在每个case -block结束时生成break并省去麻烦。

但是,有一种情况(已在本网站上讨论过),我可以提出这可能是明确使用break的原因:

 switch (foo) { case 0: case 1: bar(); break; default: break; } 

这里,如果foo的值为0或1,则调用方法bar()

如果编译器本身会生成break语句,那么这个选项会在最真实的意义上break 。 这是它,这是为什么rest是强制性的还是有其他正当理由?

我怀疑C#要求开发人员在每个案例结尾处放置一个break或terminal语句的原因是为了清楚起见。

它避免了语言的新手假设C#中的switch()表现得像C或C ++中的switch,其中发生了直通行为。 只有在相邻空案例的情况下才会在C#中发生 – 这是相对明显的。

编辑:实际上,在C#中,fallthrough始终是非法的。 然而,合法的是将一个案例与两个或多个标签相关联。 Eric Lippert详细讲述了这种行为以及它与C / C ++ switch语句的区别 。

您可能有兴趣阅读Eric Lipperts博客上的这篇文章。

这个问题预示着虚假,因此无法回答。 该语言不需要在切换部分的末尾中断。 该语言要求交换机部分的语句列表必须具有无法到达的端点 。 “break”只是具有此属性的最常用语句。 使用“return;”,“goto case 2;”,“throw new Exception();”结束切换部分是完全合法的。 或“while(true){}”(或者在某些情况下,继续,但这通常是一个坏主意。)

我们要求具有无法访问端点的语句列表的原因是强制执行“不通过”规则。

如果你的问题更好地陈述为“为什么当我无法生成带有无法到达终点的语句列表的交换机部分时,编译器会自动修复我的错误,通过代表我插入break语句?”,那么答案是C#不是“猜测开发人员可能意味着什么,并通过某种语言混淆。 有些语言是 – 例如JScript – 但C#不是。

我们认为犯错误的C#程序员希望被告知这些错误,以便他们能够故意和刻意地纠正错误,这是一件好事。 我们的客户告诉我们,他们不希望编译器猜测他们的意思并希望最好。 这就是为什么C#也不会像JScript那样猜测丢失分号的位置,或者当你试图像JScript那样修改只读变量时静默失败,等等。

通过使break可选,你可以打开这样的bug:

 switch (thing_result) { case GOOD_THING: IssueReward(); // UH-OH, missing break! case BAD_THING: IssuePunishment(); break; } 

C#语言设计者试图帮助程序员避免使用它之前的语言中的陷阱,通常是通过强制程序员更明确(例如显式使用’override’或’new’关键字来实现或隐藏虚拟成员)。

我对此问题的理解是它包含在内以匹配C ++语法。

如果您不需要rest一下,就会出现问题

 switch (number) { case 0: case 1: DoSomething(); } 

如果number == 0会怎么样? 这是一个没有做任何事情的空案例,还是会执行DoSomething()?