2009-11-25 70 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