如果它不是可选的,为什么C#会中断?

时间:2010-06-24 09:57:54

标签: c# switch-statement break

当我在VS2008 C#中创建switch语句时,就像这样(做作):

switch (state) {
    case '1':
        state = '2';
    case '2':
        state = '1';
}

它抱怨我不允许通过:

  

控件不能从一个案例标签('case'1'(0x31):')转移到另一个案例标签

如果您不被允许通过,那么break声明的目的是什么?为什么语言设计师不会将其遗漏并自动跳转到switch语句的末尾,而不是强迫我们输入不必要的构造?

4 个答案:

答案 0 :(得分:86)

基本上是让C / C ++ / Java开发人员更熟悉它。我个人认为这是一个错误,但这就是推理。

我更喜欢强制阻止:

case '1':
{
}

除了其他任何东西,这将避免切换/案例的奇怪的变量范围情况。当然,您仍然可以拥有多个案例标签:

case '0':
case '1':
{
}

能够更简单地列出多个案例也可能很好:

case '0', '1':
{
}

哦,对你对现有语言的描述略有挑剔:你不 休息一下。只是案件的结尾必须无法到达。您还可以拥有throwgotoreturn。可能还有其他人我也错过了:)

答案 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#中breakgoto,但您不能做的不是您想要的状态,因为这是难以发现的错误的潜在来源。

当您想要goto(或反之亦然)时,发现代码显示break比发现您忘记添加任何内容要容易得多。

听起来可能听起来很愚蠢,但很多人花了两个小时寻找C ++错误的原因,突然意识到你忘了添加一个break并且你的代码一直在下降。 C#通过强迫你说出你想要的东西来避免这种情况。

答案 3 :(得分:12)

如果你在案例1中没有任何代码,你就可以通过,所以你可以说“所有这些案例共享这段代码”