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,goto或return.可能还有其他我错过了:)
Ale*_* K. 73
从马口(MSDN)为什么C#switch语句设计为不允许掉线,但仍需要休息?.
引用显着位,这就是为什么它们不允许掉线:
这种隐式的直通行为通常用于减少所需的代码量,并且在第一次编写代码时通常不会成为问题.但是,随着代码从初始开发阶段进入维护阶段,上面的代码可能会导致很难调试的细微错误.这些错误是由于开发人员添加一个案例的常见错误造成的,但却忘了在块的末尾放置一个中断.
在C#中,switch语句要求在case结束时发生显式流控制,可以是break,goto,return或throw.如果开发人员需要直接语义,则可以通过case语句末尾的显式goto来实现.
这就是为什么它不是自动的:
由于C#规则要求在案例块结束时发生显式流控制(最常见的是中断),许多人质疑为什么行为根本没有改变,以至于没有发生跌倒.也就是说,不需要中断,只需将switch的语义更改为没有直通案例.之所以没有这样做是为了让那些非常习惯C++的开发人员不会很难理解switch语句的作用.
Chr*_*ris 46
您可以通过,但必须使用关键字明确地执行此goto操作:
switch (state) {
case '1':
state = '2';
goto case '2';
case '2':
state = '1';
break;
}
Run Code Online (Sandbox Code Playgroud)
你可以break或goto在C#中,但你不能做的不是你想要的状态,因为这是一个难以发现的错误的潜在来源.
你可以更容易地发现你的代码goto在你想要的时候break(反之亦然),而不是发现你忘了添加它们.
这可能听起来很愚蠢,但很多人花了两个小时搜索C++错误的原因,突然意识到你忘了添加一个,break而你的代码一直在下降.C#通过强制你说出你想要的东西来避免这种情况.