Instrucción Switch
Instrucción Switch
Una instrucción switch funciona de un modo muy similar a una construcción con if...else if...
else. Sin embargo, hay un diferencia que es fundamental: mientras en las construcciones
if...else if... else las condiciones pueden ser distintas en cada uno de los if ... else if, en
un switch se evalúa siempre la misma expresión, comprobando todos los posibles
resultados que esta pueda retornar. Un switch equivaldría a comprobar las diferentes
situaciones que se pueden dar con respecto a una misma cosa. Por ejemplo, si te compras un
coche y tienes varias opciones de financiación: En caso de usar la primera opción te descuento
un 10 por ciento, en caso de usar la segunda opción te descuento un cinco por ciento, en caso
de usar la tercera opción te descuento un dos por ciento, y en cualquier otro caso no te
descuento nada. Como ves, se comprueba siempre el valor de un solo elemento, que en este
caso sería la opción. Pongamos un poco de pseudo-código otra vez:
comprobemos (opcion)
{
en caso de 1:
te descuento un 10%;
Nada más;
en caso de 2:
te descuento un 5%;
Nada más;
en caso de 3:
te descuento un 2%;
Nada más;
en otro caso:
no te descuento nada;
Nada más;
}
Bueno, como veis, se comprueba siempre lo que vale "opcion"; si vale 1 sucede el primer caso,
si vale 2 el segundo, si vale 3 el tercero, y si vale cualquier otra cosa sucede el último caso.
Vamos a verlo en C#:
switch (opcion)
{
case 1:
descuento=10;
break;
case 2:
descuento=5;
break;
case 3:
descuento=2;
break;
default:
descuento=0;
break;
}
Hay algunas cosas importantes en las que quiero que te fijes especialmente: solamente se
establece un bloque para la instrucción "switch", pero ninguno de los "case" abre ningún bloque
(tampoco lo hace "default"). Una vez que se terminan las instrucciones para cada caso hay que
poner "break" para que el compilador salga del switch (esto lo digo especialmente para los
programadores de Visual Basic, ya que en VB no había que poner nada al final de cada Case
en un Select Case). ¿Y qué ocurre si no se cierra el "case" con un "break"? Bien, pueden
ocurrir dos cosas.
Veamos: si queremos que el programa haga las mismas cosas en distintos casos, habrá que
poner todos estos casos y no cerrarlos con break. Por ejemplo, si el descuento es 5 tanto para
la segunda como para la tercera opción, habría que hacerlo así:
switch (opcion)
{
case 1:
descuento=10;
break;
case 2:
case 3:
descuento=5;
break;
default:
descuento=0;
break;
}
Así, en caso de que opcion valiera 2 ó tres, el descuento sería del 5%, pues, si opcion vale 2, el
flujo del programa entraría por case 2 y continuaría por case 3 ejecutando el código de este
último al no haber cerrado el case 2 con break, y si opción vale 3 entraría por case 3
ejecutando, por lo tanto, el mismo código. Sin embargo, no hubiera sido válido establecer
acciones para el case 2 sin cerrarlo con break.
switch (opcion)
{
case 1:
descuento=10;
break;
case 2:
regalo="Cargador de CD"
case 3:
descuento=5;
break;
default:
descuento=0;
break;
}
Voy a examinar esto como si estuviera escrito en C/C++: si opcion vale 2, el flujo entraría por
case 2, estableciendo el regalo y seguiría por case 3 estableciendo también el descuento, dado
que case 2 no ha sido cerrado con un break. Si opción vale 3 entraría solamente por case 3,
estableciendo únicamente el descuento y no el regalo. Ciertamente, esto era muy cómodo si
querías definir acciones específicas para un valor determinado y añadirles otras que fueran
comunes para varios valores. Sin embargo, esto no se puede hacer en C#, dado que el
compilador avisaría de un error, diciendo que hay que cerrar case 2. ¿Por qué? Pues bien, a
pesar de la comodidad de esta construcción en C/C++ para determinadas circunstancias, lo
cierto es que lo más común es que se omita el break por error que por intención, lo cual
provoca muchos fallos que serían muy difíciles de detectar. Por este motivo, los diseñadores
del lenguaje C# decidieron que el riesgo no merecía la pena, ya que esta funcionalidad se
puede conseguir fácilmente con un simple if, así:
switch (opcion)
{
case 1:
descuento=10;
break;
case 2:
case 3:
if (opcion==2) regalo="Cargador de CD";
descuento=5;
break;
default:
descuento=0;
break;
}
Es cierto que esto es un poco más incómodo, pero también es cierto que es mucho más
seguro, ya que se evitan los problemas que sobrevenían en C/C++ cuando te olvidabas de
poner un break.
Para terminar, la expresión que se ha de comprobar en un switch ha de ser, necesarimente,
compatible con los tipos sbyte, byte, short, ushort, int, uint, long, ulong, char o
Switch
La instrucción switch nos va a facilitar mucho trabajo en determinados
programas. Supongamos que queremos hacer un programa que dé un número
entero y escriba por pantalla su valor ordinal (primero, segundo, etc...).