2009-11-25 66 views
11

看来我需要在使用C#的switch语句中的每种情况下使用中断。C#switch/break

我可以看到其他语言的原因,你可以通过下一个case语句。

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

非常感谢,非常感谢!

回答

29

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

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

空案例陈述不合法,'case 1'不能反驳这一点。参见[Eric Lippert的解释](http://stackoverflow.com/questions/3047863/how-can-i-use-more-than-one-constant-for-a-switch-case-in-c/3049601#3049601 ),以及我的评论,提到为什么区别不是迂腐。告诉人们空白区块是合法的[导致他们犯错误](http://stackoverflow.com/q/8071655/18192)。 – Brian 2011-11-09 21:50:17

+3

@Brian:如果你喜欢,你可以称它为别的东西,但上面的代码是完全合法的。从技术上讲,代码当然不会作为一系列代码块来实现,但在任何语言中都不是这样,对于大多数控制结构也是如此。你链接的错误根本不涉及空例(或者你喜欢称之为的任何东西),因为它不是空的。 – Guffa 2011-11-09 22:19:11

2

C#不支持通过构造隐式下降,但break(或goto)仍然在那里(msdn)。你能做的唯一的事情是堆栈情况如下方式:

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

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

+0

这不太准确。这不是一个“跳跃”声明(我认为你的意思是休息,继续,转身,返回或抛出)必须在最后,这是一个终点不可达的声明。所有的“跳转”语句都有这个属性,但也有其他的属性声明。例如,虽然很少,但用“while(true)M()”结束开关部分是完全合法的;“ – 2009-11-25 15:54:46

+1

我看到MSDN文档不正确。我会和文档管理员谈一谈。 – 2009-11-25 15:55:40

5

的“破发”的执法是有停止的错误。如果您需要强制下降得来速然后用“的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

+1

如果它不支持通过,那么就没有可以防止的错误。无论是否有休息,如果语言不支持通过,它不支持它,底线。编译'break'的时间执行;'并不妨碍你意外地通过,因为正如你所说,通过甚至不支持,所以这样的事故不会发生... – AaronLS 2014-05-06 19:17:04

0

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

...但在,他们是灰色的休息时间,所以认为没有实际意义。所以,至少在我的情况下,他们被允许但不是必需的。

+1

返回语句(以及抛出异常)原因离开完整方法的代码,这就是为什么不需要下面的break语句的原因。没有开关结构要离开了。 – Udontknow 2016-11-21 11:08:20