为什么C#如果不是可选的,会中断?
当我在VS2008 C#中创build一个switch
语句就像这样(人为的):
switch (state) { case '1': state = '2'; case '2': state = '1'; }
它抱怨我不允许通过:
控件不能从一个案例标签('case'1'(0x31):')到另一个案例标签
如果你不允许的话,那么break
发言的目的是什么呢? 为什么语言devise者不把它抛出去,自动跳到switch
语句的结尾,而不是强迫我们放入一个不必要的结构?
从马的嘴里(MSDN) 为什么C#switch语句的devise不允许翻倒,但还是需要rest一下? 。
引用突出的部分,这就是为什么他们不允许翻倒:
这种隐式的贯穿行为通常用于减less所需的代码量,而且在第一次编写代码时通常不是问题。 但是,随着代码从最初的开发阶段进入维护阶段,上面的代码可能会导致难以debugging的细微错误。 这些错误是由开发人员添加案例的常见错误造成的,但却忘了在块的末尾放置一个中断。
在C#中,switch语句要求明确的stream程控制发生在一个case的结尾,不论是break,goto,return还是throw。 如果开发者希望通过fall-through语义,可以通过在case语句结尾的显式转到来实现。
这就是为什么它不是自动的:
由于C#规则要求在一个case块的最后(通常是一个break)结束时需要明确的stream量控制,所以许多人质疑为什么行为没有被改变,从而没有发生转场。 也就是说,不要求中断,只是简单地把开关的语义改为没有中断的情况。 之所以没有这样做,是因为那些非常习惯C ++的开发人员不会很难理解switch语句在做什么。
基本上让C / C ++ / Java开发人员更熟悉。 我个人认为这是一个错误,但这是推理。
我宁愿强制阻止:
case '1': { }
除此之外,这将避免奇怪的variables范围的开关/情况。 当然,您仍然可以拥有多个案例标签:
case '0': case '1': { }
能够更简单地列出多个案例可能也不错:
case '0', '1': { }
噢,你对现有语言的描述略有不同:你不必rest。 只是案件的结局必须无法达成。 你也可以throw
, goto
或return
。 可能还有其他的我也错过了:)
你被允许通过,但你必须明确地使用goto
关键字来完成:
switch (state) { case '1': state = '2'; goto case '2'; case '2': state = '1'; break; }
你可以break
或goto
C#,但你不能做的不是你想要的状态,因为这是一个难以察觉的错误的潜在来源。
发现你的代码在你想要break
(或者反过来)要比你发现忘记添加更容易。
这可能听起来很愚蠢,但是对于一个C ++错误的原因,许多累赘的两个小时的search却突然意识到,你忘了添加一个break
而且你的代码一直在下降。 C#避免了强迫你陈述你想要的东西。
如果你在案例1中没有任何代码,你可以通过,所以你可以说,“所有这些案件都分享这段代码”