Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#开关/断路器_C#_Switch Statement_Break - Fatal编程技术网

C#开关/断路器

C#开关/断路器,c#,switch-statement,break,C#,Switch Statement,Break,似乎我需要在switch语句的每个case块中使用一个break,使用C# 我可以在其他语言中看到这一点的原因,在这些语言中,您可以进入下一个案例陈述 案例模块是否有可能落入其他案例模块 非常感谢,非常感谢 C#不支持隐式fall-through构造,但是break(或goto)必须存在()。您唯一能做的就是按以下方式堆叠案例: switch(something) { case 1: case 2: //do something break; ca

似乎我需要在switch语句的每个case块中使用一个break,使用C#

我可以在其他语言中看到这一点的原因,在这些语言中,您可以进入下一个案例陈述

案例模块是否有可能落入其他案例模块

非常感谢,非常感谢

C#不支持隐式fall-through构造,但是
break
(或
goto
)必须存在()。您唯一能做的就是按以下方式堆叠案例:

switch(something) {
    case 1:
    case 2:
      //do something
      break;
    case 3:
      //do something else
}

但是,
break
(或另一个跳转语句,如
goto
)只需要在那里。

是的,您可以通过两种方式跳转到下一个case块。您可以使用不需要中断的空案例,也可以使用
goto
跳转到下一个(或任何)案例:

执行“中断”是为了阻止bug。如果需要强制通过,则使用“goto case”(用适当的值替换)

以下示例显示了您可以执行的操作:

switch(n)
{
    case 1:
    case 2:
      //do something for 1+2
      //...
      goto case 3;
    case 3:
      //do something for 3, and also extra for 1+2
      //...
      break;
    default:
      //do something for all other values
      //...
      break;
}
请参见我的C#(.NET 1.1,CF)代码中的

,这两个都是允许的:

switch (_printerChoice) 
{
    case BeltPrintersEnum.ZebraQL220: 
        return new ZebraQL220Printer();
        break;
    case BeltPrintersEnum.ONeal: 
        return new ONealPrinter();
        break;
    default:            
        return new ZebraQL220Printer();         
                        break;  
}

switch (_printerChoice) 
{
    case BeltPrintersEnum.ZebraQL220: 
        return new ZebraQL220Printer();
    case BeltPrintersEnum.ONeal: 
        return new ONealPrinter();
    default:            
        return new ZebraQL220Printer();         
}

…但随着入室盗窃案的发生,这些案件已呈灰色,因此被认为是毫无意义的。因此,至少在我的情况下,它们是允许的,但不是必需的。

这不太准确。不是一个“跳转”语句(我假设你指的是break、continue、goto、return或throw)必须在末尾,而是一个端点不可到达的语句必须在末尾。所有“jump”语句都具有该属性,但也有其他具有该属性的语句。例如,用“while(true)M();”结束switch部分是完全合法的,尽管很少见。我发现MSDN文档是不正确的。我要和文档经理谈一谈。空的案例陈述是不合法的,
case1
不能反驳这一点。你看,我的评论也提到了为什么这种区别不是学究式的。告诉人们空箱块是合法的。@Brian:如果你愿意,你可以叫它别的名字,但上面的代码是完全合法的。严格地说,从技术上讲,代码当然不会被实现为您遇到的一系列代码块,但在任何语言中都不是这样,对于大多数控制结构也是如此。你链接到的错误根本与空案例无关(或者你喜欢叫它们什么),因为它不是空的。如果它不支持fall-through,那么就没有可以防止的bug。不管有没有中断,如果语言不支持fall-through,它就不支持fall-through,底线是。编译时执行
中断并不能防止您意外地失败,因为正如您所说,失败甚至不受支持,所以这样的事故不会发生……返回语句(以及抛出异常)会导致代码离开完整的方法,这就是为什么不需要下面的break语句的原因。再也没有交换机结构可以离开了。
switch (_printerChoice) 
{
    case BeltPrintersEnum.ZebraQL220: 
        return new ZebraQL220Printer();
        break;
    case BeltPrintersEnum.ONeal: 
        return new ONealPrinter();
        break;
    default:            
        return new ZebraQL220Printer();         
                        break;  
}

switch (_printerChoice) 
{
    case BeltPrintersEnum.ZebraQL220: 
        return new ZebraQL220Printer();
    case BeltPrintersEnum.ONeal: 
        return new ONealPrinter();
    default:            
        return new ZebraQL220Printer();         
}