2009-11-25 9 views
11

Wygląda na to, że potrzebuję użyć przerwy w każdym bloku przypadku w moim oświadczeniu switch przy użyciu C#.C# przełącznik/przerwa

Widzę przyczynę tego w innych językach, w których można przejść do następnego przypadku.

Czy bloki przypadków mogą się przedostać do innych bloków skrzynek?

Dziękuję bardzo, naprawdę docenione!

Odpowiedz

29

Tak, można przejść do następnego bloku skrzynki na dwa sposoby. Można używać pustych przypadkach, które nie potrzebują przerwy, lub użyć goto, aby przejść do następnej (lub dowolnej) Obudowa:

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

Instrukcje pustych spraw nie są legalne, a "przypadek 1" nie usuwa tego. Zobacz [Wyjaśnienie Erica Lipperta] (http://stackoverflow.com/questions/3047863/how-can-i-use-more-than-one-constant-for-a-switch-case-in-c/3049601#3049601), a także mój komentarz, który mówi, dlaczego rozróżnienie nie jest pedantyczne. Mówienie ludziom, że puste bloki przypadków są legalne [powoduje, że popełniają błędy] (http://stackoverflow.com/q/8071655/18192). – Brian

+3

@Brian: Możesz to nazwać inaczej, jeśli chcesz, ale powyższy kod jest całkowicie legalny. Ściśle technicznie kod nie zostanie oczywiście zaimplementowany jako seria bloków kodu, przez które przechodzisz, ale tak nie jest w żadnym języku, a to samo można powiedzieć o większości struktur kontrolnych. Błąd, z którym łączysz się, nie jest w ogóle związany z pustymi przypadkami (lub jakkolwiek chcesz je nazwać), ponieważ nie jest pusty. – Guffa

2

C# nie obsługuje ukrytego spadku przez konstrukcję, ale musi tam być break (lub goto) (msdn). Jedyną rzeczą, jaką możesz zrobić, to stos przypadki, w następujący sposób:

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

ale break (lub inny rachunek skok jak goto) po prostu musi tam być.

+0

To nie jest całkiem dokładne. To nie jest tak, że stwierdzenie "skoku" (przez które zakładam, że masz na myśli przerwę, kontynuację, goto, powrót lub rzut) musi być na końcu, to, że oświadczenie z nieosiągalnym punktem końcowym musi być na końcu. Wszystkie instrukcje "jump" mają tę właściwość, ale istnieją również inne instrukcje z tą właściwością. Na przykład całkowicie legalne, choć rzadkie, jest zakończenie sekcji przełącznika z "while (true) M();" –

+1

Widzę, że dokumentacja MSDN jest niepoprawna. Będę porozmawiać z menedżerem dokumentacji. –

5

Egzekwowanie „break” jest tam, aby zatrzymać błędów. Jeśli trzeba wymusić spadek-Thru a następnie użyć „przypadek goto” (Wymień z odpowiednią wartością)

poniższy przykład pokazuje, co można zrobić:

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; 
} 

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

+1

Jeśli nie obsługuje przewracania, to nie ma błędu, któremu można zapobiec. Niezależnie od tego, czy jest przerwa, czy nie, język nie wspiera, nie obsługuje go, bottom line.Skompilowane wymuszanie 'break;' nie zapobiega przypadkowemu przewróceniu się, ponieważ, jak powiedziałeś, przewrócenie nie jest nawet obsługiwane, więc taki wypadek nie może wystąpić ... – AaronLS

0

w moim C# (.NET 1.1, CF) kod, oba z nich są dozwolone: ​​

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

... ale z przerwami, są wyszarzone, więc uważane dyskusyjna. Tak więc przynajmniej w moim przypadku są one dozwolone, ale nie są wymagane.

+1

Przyczyna zwrotu (jak również wyrzucenie wyjątków) powoduje kod pozostawia kompletną metodę, dlatego nie jest potrzebne następująca instrukcja break. Nie ma już żadnej struktury przełączającej. – Udontknow