2009-11-25 12 views
11

Sembra che sia necessario utilizzare un'interruzione in ogni blocco del caso nella mia istruzione switch utilizzando C#.Interruttore C#/interruzione

Riesco a vedere il motivo di ciò in altre lingue in cui è possibile accedere alla dichiarazione del caso successiva.

È possibile che i blocchi del caso cadano in altri blocchi del caso?

Grazie mille, davvero apprezzato!

risposta

29

Sì, è possibile passare al blocco del caso successivo in due modi. È possibile utilizzare i casi vuoti, che non hanno bisogno di una pausa, oppure è possibile utilizzare goto per passare a quello successivo (o qualsiasi) caso:

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

Gli statement case vuoti non sono legali e 'case 1' non lo contesta. Vedi [Spiegazione di Eric Lippert] (http://stackoverflow.com/questions/3047863/how-can-i-use-more-than-one-constant-for-a-witch-case-in-c/3049601#3049601), così come il mio commento che menziona perché la distinzione non è pedante. Dire alle persone che i blocchi di casi vuoti sono legali [li fa commettere errori] (http://stackoverflow.com/q/8071655/18192). – Brian

+3

@Brian: Puoi chiamarlo qualcos'altro se vuoi, ma il codice sopra è perfettamente legale. Strettamente dal punto di vista tecnico, ovviamente, il codice non verrà implementato come una serie di blocchi di codice che si verificano, ma non è il caso in nessuna lingua, e lo stesso si può dire della maggior parte delle strutture di controllo. L'errore a cui ti colleghi non è in alcun modo collegato ai casi vuoti (o qualsiasi altra cosa ti piaccia chiamarli), in quanto non è vuoto. – Guffa

2

C# non supporta il costrutto implicito, ma lo break (o goto) deve comunque essere presente (msdn). L'unica cosa che puoi fare è impilare i casi nel modo seguente:

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

ma che break (o un'altra istruzione salto come goto) ha solo bisogno di essere lì.

+0

Questo non è abbastanza preciso. Non è che una dichiarazione di "salto" (da cui presumo tu intenda pausa, continua, goto, ritorno o lancio) deve essere alla fine, è che un'istruzione con un punto finale irraggiungibile deve essere alla fine. Tutte le istruzioni "jump" hanno quella proprietà, ma ci sono anche altre dichiarazioni con quella proprietà. Ad esempio, è perfettamente legale, anche se raro, terminare una sezione di switch con "while (true) M();" –

+1

Vedo che la documentazione MSDN non è corretta. Parlerò con il responsabile della documentazione. –

5

L'applicazione della "rottura" è lì per smettere di insetti. Se avete bisogno di forzare un autunno-thru quindi utilizzare "caso goto" (sostituire il con il valore appropriato)

L'esempio seguente mostra cosa si può fare:

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

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

+1

Se non supporta la caduta, non c'è alcun errore da prevenire. Se una pausa è presente o meno, se la lingua non supporta la caduta, non la supporta, in fondo.Compilare l'applicazione del tempo di 'pausa;' non ti impedisce di cadere accidentalmente, perché come hai detto, la caduta non è nemmeno supportata in modo che un tale incidente non possa verificarsi ... – AaronLS

0

Nella mia codice C# (.NET 1.1, CF), entrambi questi è autorizzato:

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

... ma con le pause in, sono in grigio, quindi considerate discutibile. Quindi, almeno nel mio caso, sono ammessi ma non richiesti.

+1

Una dichiarazione di ritorno (oltre a generare eccezioni) causa il codice per lasciare il metodo completo, ecco perché non è necessaria una successiva istruzione break. Non c'è più una struttura di commutazione da lasciare. – Udontknow