如果C#是';这不是可选的吗?

如果C#是';这不是可选的吗?,c#,switch-statement,break,C#,Switch Statement,Break,当我在VS2008 C中创建一个switch语句时,如下所示(人为): 它抱怨不允许我通过: 控件不能从一个案例标签('case'1'(0x31):')掉落到另一个案例标签 如果不允许您访问,那么break语句的目的是什么?为什么语言设计者不直接忽略它,并自动跳转到switch语句的末尾,而不是强迫我们加入一个不必要的构造?如果案例1中没有任何代码,则允许您失败,因此您可以说“所有这些案例都共享这段代码”基本上是为了让C/C++/Java开发人员更熟悉它。我个人认为这是一个错误,但这就是原因 我

当我在VS2008 C中创建一个
switch
语句时,如下所示(人为):

它抱怨不允许我通过:

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


如果不允许您访问,那么
break
语句的目的是什么?为什么语言设计者不直接忽略它,并自动跳转到
switch
语句的末尾,而不是强迫我们加入一个不必要的构造?

如果案例1中没有任何代码,则允许您失败,因此您可以说“所有这些案例都共享这段代码”

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

我更喜欢强制闭塞:

case '1':
{
}
除此之外,这将避免开关/案例的奇怪变量作用域情况。当然,您仍然可以有多个案例标签:

case '0':
case '1':
{
}
也可以更简单地列出多个案例:

case '0', '1':
{
}

哦,对你对现有语言的描述有点吹毛求疵:你不需要休息。只是案件的结局必须是遥不可及的。您还可以使用
throw
goto
return
。可能还有其他一些我也错过了:)

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

switch (state) {
    case '1':
        state = '2';
        goto case '2';
    case '2':
        state = '1';
        break;
}
在C#中,您可以
中断
转到
,但您不能做的是不声明您想要的,因为这是难以发现的错误的潜在来源

当您想要
中断时(或反之亦然),发现您的代码显示
转到
(goto
),要比发现您忘记添加任何一个代码容易得多

听起来可能很愚蠢,但是很多对C++错误的原因进行了两个小时的搜索,突然意识到你忘记添加一个<代码>破解< /代码>,代码一直在下降。C#通过强迫你说出你想要什么来避免这种情况。

来自马口铁(MSDN)

引用突出的部分,这就是为什么他们不允许出现漏失:

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

在C#中,switch语句要求在案例结束时进行显式流控制,可以是break、goto、return或throw。如果开发人员希望通过语义实现,那么可以通过在case语句末尾显式goto来实现

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

由于C#规则要求在案例块结束时(通常是中断)进行显式流控制,许多人质疑为什么行为没有改变,从而不会发生失败。也就是说,不必设置break required,只需将switch的语义更改为nothavefall-through for cases。这是不被做的原因是,那些非常习惯C++的开发者不会很难理解开关语句所做的事情。
但在这种情况下,你不会得到警告。编译器正在警告您它可以推断出什么。@Jon+1-从来都不知道您可以这么做!我认为这是一个很好的决定,不要让相同的结构表现出不同的行为。对于那些不得不频繁切换语言的程序员来说,这将是一个地狱。我也喜欢“0”、“1”语法。D编程语言在IMO中有一个更好的切换:它允许案例1、2、3和案例1。。案例10来自to@GenericTypeTea:不,它们不是多余的:它们定义了一个新的作用域。实际上,本例中“直接”声明的变量在整个switch语句的范围内,这很奇怪。我希望加强大括号,但要使其有效地自动断开。如果需要,您仍然可以返回或抛出。也许最好的解决方案是使用/switch-section/获取/embedded语句/而不是/statement-list/。然后它将匹配
if
while
for
等。不需要中断。你会得到一份声明。更重要的是,你要戴上牙套。那太棒了。我很尴尬,我不知道你能“继续”。我只是觉得避免所有掉下来的虫子是违法的。。。谢谢:)你试过这个代码吗?它不能编译。您可以执行“goto case'2'”,但会给我“没有可中断或继续的封闭循环”实际上,您可能是对的,我的测试在一个while循环内(我将其插入当前项目)。这意味着这将不会下降,甚至会重新启动循环-这将是一个非常恼人的错误:-)链接不再处于活动状态。现在,在写了7次之后,我们看到这个决定是多么愚蠢。现在我们介绍了模式匹配,一个新的概念,他们决定共同选择<代码>开关>代码>语法,现在被“2年前没有混淆C++程序员”的决定所困扰。不是最好的选择,c队。
switch (state) {
    case '1':
        state = '2';
        goto case '2';
    case '2':
        state = '1';
        break;
}