2009-11-25 14 views
11

Parece que necesito usar un corte en cada bloque de caja en mi declaración de interruptor usando C#.C# switch/break

Puedo ver el motivo de esto en otros idiomas donde puede pasar al siguiente enunciado de caso.

¿Es posible que los bloques de cajas caigan a través de otros bloques de cajas?

Muchas gracias, realmente apreciado!

Respuesta

29

Sí, puede pasar al siguiente bloque de casos de dos maneras. Puede utilizar cajas vacías, que no necesitan un descanso, o puede utilizar goto para saltar a la siguiente (o cualquier) 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

Las declaraciones de casos vacíos no son legales y el 'caso 1' no lo contrarresta. Véase [Explicación de Eric Lippert] (http://stackoverflow.com/questions/3047863/how-can-i-use-more-than-one-constant-for-a-switch-case-in-c/3049601#3049601), así como mi comentario al mencionar por qué la distinción no es pedante. Diciéndole a la gente que los bloques de casos vacíos son legales [hace que cometan errores] (http://stackoverflow.com/q/8071655/18192). – Brian

+3

@Brian: Puedes llamarlo de otra forma si quieres, pero el código anterior es perfectamente legal. Estrictamente técnico, el código, por supuesto, no se implementará como una serie de bloques de código de los que no se tiene éxito, pero ese no es el caso en ningún idioma, y ​​lo mismo puede decirse de la mayoría de las estructuras de control. El error al que se vincula no está relacionado con ningún caso vacío (o como quiera llamarlo), ya que no está vacío. – Guffa

2

C# no admite la caída implícita a través de la construcción, pero el break (o goto) tiene que estar allí (msdn). La única cosa que puede hacer es apilar los casos de la siguiente manera:

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

pero que break (u otra instrucción de salto como goto) sólo tiene que estar allí.

+0

Esto no es del todo exacto. No es que una declaración de "salto" (por la cual asumo que quieres decir rotura, continuar, ir, regresar o tirar) tiene que ser al final, es que una declaración con un punto final inalcanzable tiene que ser al final. Todas las declaraciones de "salto" tienen esa propiedad, pero también hay otras declaraciones con esa propiedad. Por ejemplo, es perfectamente legal, aunque raro, terminar una sección de cambio con "while (true) M();" –

+1

Veo que la documentación de MSDN es incorrecta. Tendré una charla con el administrador de documentación. –

5

La aplicación de la "ruptura" está ahí para dejar de insectos. Si necesita forzar una caída Seguido a continuación, utilizar el "caso Goto" (reemplazar el con valor apropiado)

El siguiente ejemplo muestra lo que puede hacer:

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

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

+1

Si no admite caída, no hay errores que prevenir. Ya sea que haya un receso o no, si el lenguaje no es compatible, no lo admite, línea inferior.La compilación del tiempo de compilación de 'break;' no evita que se caiga accidentalmente, porque como dijo, la caída ni siquiera es compatible, por lo que dicho accidente no puede ocurrir ... – AaronLS

0

En mi C# (.NET 1.1, CF) de código, ambos están permitidos:

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

... pero con las roturas en, que están en gris, por lo que se consideran discutible. Entonces, al menos en mi caso, están permitidos pero no son obligatorios.

+1

Una declaración de devolución (así como arrojar Excepciones) causa el código para dejar el método completo, es por eso que no se necesita una siguiente declaración de interrupción. No hay una estructura de conmutación para partir más. – Udontknow