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

pax*_*blo 91 c# break switch-statement

当我switch在VS2008 C#中创建一个声明时(如此)(人为):

switch (state) {
    case '1':
        state = '2';
    case '2':
        state = '1';
}
Run Code Online (Sandbox Code Playgroud)

它抱怨说我不被允许通过:

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

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

Jon*_*eet 87

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

我宁愿选择强制阻止:

case '1':
{
}
Run Code Online (Sandbox Code Playgroud)

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

case '0':
case '1':
{
}
Run Code Online (Sandbox Code Playgroud)

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

case '0', '1':
{
}
Run Code Online (Sandbox Code Playgroud)

哦,你现有的语言描述略有挑剔:你不具备有一个突破.只是案件的结尾必须无法到达.你也可以拥有throw,gotoreturn.可能还有其他我错过了:)

  • @Jon +1 - 永远不知道你能做到这一点! (3认同)

Ale*_* K. 73

从马口(MSDN)为什么C#switch语句设计为不允许掉线,但仍需要休息?.

引用显着位,这就是为什么它们不允许掉线:

这种隐式的直通行为通常用于减少所需的代码量,并且在第一次编写代码时通常不会成为问题.但是,随着代码从初始开发阶段进入维护阶段,上面的代码可能会导致很难调试的细微错误.这些错误是由于开发人员添加一个案例的常见错误造成的,但却忘了在块的末尾放置一个中断.

在C#中,switch语句要求在case结束时发生显式流控制,可以是break,goto,return或throw.如果开发人员需要直接语义,则可以通过case语句末尾的显式goto来实现.

这就是为什么它不是自动的:

由于C#规则要求在案例块结束时发生显式流控制(最常见的是中断),许多人质疑为什么行为根本没有改变,以至于没有发生跌倒.也就是说,不需要中断,只需将switch的语义更改为没有直通案例.之所以没有这样做是为了让那些非常习惯C++的开发人员不会很难理解switch语句的作用.

  • 现在,在写完这篇文章之后,我们看到这个决定是多么愚蠢.现在我们正在引入模式匹配,这是一个热门的新概念,他们决定选择"切换"语法,现在陷入了"二十年前没有混淆c ++程序员"的决定.不是最好的选择,c#团队. (8认同)
  • http://web.archive.org/web/20110515005800/http://msdn.microsoft.com/en-us/vcsharp/aa336815.aspx (2认同)

Chr*_*ris 46

您可以通过,但必须使用关键字明确地执行此goto操作:

switch (state) {
    case '1':
        state = '2';
        goto case '2';
    case '2':
        state = '1';
        break;
}
Run Code Online (Sandbox Code Playgroud)

你可以breakgoto在C#中,但你不能做的不是你想要的状态,因为这是一个难以发现的错误的潜在来源.

你可以更容易地发现你的代码goto在你想要的时候break(反之亦然),而不是发现你忘了添加它们.

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

  • 你试过这段代码吗?它不编译.你可以做"转到案例'2'". (3认同)
  • 我很尴尬,我不知道你可以"继续".只是认为避免所有陷入错误是违法的...谢谢:) (2认同)
  • 实际上,你可能是对的,我的测试_is_在一个while循环(我把它插入我当前的项目).这意味着重启循环不会这么多 - 这将是一个非常烦人的错误:-) (2认同)

sim*_*sjo 12

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