【问题标题】:C# switch/breakC# 切换/中断
【发布时间】:2010-12-20 03:55:57
【问题描述】:

看来我需要在使用 C# 的 switch 语句中的每个 case 块中使用一个中断。

我可以在其他语言中看到这种情况的原因,您可以通过下一个 case 语句。

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

非常感谢,非常感谢!

【问题讨论】:

    标签: c# switch-statement break


    【解决方案1】:

    在我的 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();         
    }
    

    ...但是随着闯入,它们会变灰,因此被认为没有实际意义。因此,至少在我的情况下,它们是允许的,但不是必需的。

    【讨论】:

    • 一个 return 语句(以及抛出异常)会导致代码离开完整的方法,这就是为什么不需要后面的 break 语句的原因。没有开关结构可以离开了。
    【解决方案2】:

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

    switch (n) {
      case 1:
      case 2:
      case 3:
        Console.WriteLine("1, 2 or 3");
        goto case 4;
      case 4:
        Console.WriteLine(4);
        break;
    }
    

    【讨论】:

    • 空案陈述是不合法的,case 1 不反对这一点。请参阅 Eric Lippert's Explanation 以及我的评论,其中提到了为什么区分不是迂腐的。告诉人们空箱子是合法的causes them to make mistakes.
    • @Brian:如果你愿意,你可以叫它别的名字,但上面的代码是完全合法的。从技术上讲,代码当然不会被实现为您遇到的一系列代码块,但在任何语言中都不是这样,大多数控制结构也是如此。您链接到的错误根本与空案例(或您喜欢称它们的任何名称)无关,因为它不是空的。
    【解决方案3】:

    执行“break”是为了阻止错误。如果您需要强制失败,请使用“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;
    }
    

    http://msdn.microsoft.com/en-us/library/06tc147t%28VS.80%29.aspx

    【讨论】:

    • 如果不支持fall through,那么就没有bug可以预防了。不管有没有中断,如果语言不支持失败,它不支持它,底线。 break; 的编译时强制执行并不能防止您意外掉线,因为正如您所说,甚至不支持掉线,因此不会发生此类事故......
    【解决方案4】:

    C# 不支持隐式遍历构造,但break(或goto)仍然必须存在(msdn)。您唯一能做的就是以下列方式堆叠案例:

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

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

    【讨论】:

    • 这不太准确。并不是“跳转”语句(我假设您的意思是中断、继续、转到、返回或抛出)必须在末尾,而是具有无法到达终点的语句必须在末尾。所有“跳转”语句都具有该属性,但也有其他语句具有该属性。例如,用“while(true) M();”结束一个 switch 部分是完全合法的,虽然很少见。
    • 我看到 MSDN 文档不正确。我会和文档经理谈谈。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 2019-09-07
    相关资源
    最近更新 更多