当我在VS2008 C#中创建switch
语句时,就像这样(做作):
switch (state) {
case '1':
state = '2';
case '2':
state = '1';
}
它抱怨我不允许通过:
控件不能从一个案例标签('case'1'(0x31):')转移到另一个案例标签
如果您不被允许通过,那么break
声明的目的是什么?为什么语言设计师不会将其遗漏并自动跳转到switch
语句的末尾,而不是强迫我们输入不必要的构造?
答案 0 :(得分:86)
基本上是让C / C ++ / Java开发人员更熟悉它。我个人认为这是一个错误,但这就是推理。
我更喜欢强制阻止:
case '1':
{
}
除了其他任何东西,这将避免切换/案例的奇怪的变量范围情况。当然,您仍然可以拥有多个案例标签:
case '0':
case '1':
{
}
能够更简单地列出多个案例也可能很好:
case '0', '1':
{
}
哦,对你对现有语言的描述略有挑剔:你不 休息一下。只是案件的结尾必须无法到达。您还可以拥有throw
,goto
或return
。可能还有其他人我也错过了:)
答案 1 :(得分:73)
从马的口中(MSDN)Why is the C# switch statement designed to not allow fall-through, but still require a break?。
引用显着位,这就是为什么它们不允许掉线:
这种隐式的直通行为通常用于减少所需的代码量,并且在第一次编写代码时通常不会成为问题。但是,随着代码从初始开发阶段进入维护阶段,上面的代码可能会导致很难调试的细微错误。这些错误是由于开发人员添加案例时常犯的错误,但却忘记在块的末尾放置一个中断。
在C#中,switch语句要求在case结束时发生显式流控制,可以是break,goto,return或throw。如果开发人员需要直接语义,则可以通过case语句末尾的显式goto来实现。
这就是为什么它不是自动的:
由于C#规则要求在案例块结束时发生显式流量控制(最常见的是休息时间),许多人质疑为什么行为根本没有改变,以至于没有改变发生。也就是说,不需要中断,只需将switch的语义更改为没有直通案例。之所以没有这样做是为了让那些习惯于使用C ++的开发人员不会很难理解switch语句的作用。
答案 2 :(得分:42)
您可以通过goto
关键字显式进行操作,但是您必须这样做:
switch (state) {
case '1':
state = '2';
goto case '2';
case '2':
state = '1';
break;
}
您可以在C#中break
或goto
,但您不能做的不是您想要的状态,因为这是难以发现的错误的潜在来源。
当您想要goto
(或反之亦然)时,发现代码显示break
比发现您忘记添加任何内容要容易得多。
听起来可能听起来很愚蠢,但很多人花了两个小时寻找C ++错误的原因,突然意识到你忘了添加一个break
并且你的代码一直在下降。 C#通过强迫你说出你想要的东西来避免这种情况。
答案 3 :(得分:12)
如果你在案例1中没有任何代码,你就可以通过,所以你可以说“所有这些案例共享这段代码”