Introducción a C#
Por Nacho Cabanes, versión 0.93 de 16-abr-2010


(Nota: Estás viendo una versión del curso antigua, creada en 2009. Es recomendable que sigas la versión 2015, mucho más actualizada, con contenidos más detallados, más ejemplos y más ejercicios propuestos)

3.1.10. switch

Si queremos ver varios posibles valores, sería muy pesado tener que hacerlo con muchos "if" seguidos o encadenados. La alternativa es la orden "switch", cuya sintaxis es

  switch (expresión)
  {
     case valor1: sentencia1;
            break;
     case valor2: sentencia2;
            sentencia2b;
            break;
      ...
     case valorN: sentenciaN;
            break;
    default:
            otraSentencia;
            break;
  };

Es decir, se escribe tras "switch" la expresión a analizar, entre paréntesis. Después, tras varias órdenes "case" se indica cada uno de los valores posibles. Los pasos (porque pueden ser varios) que se deben dar si se trata de ese valor se indican a continuación, terminando con "break". Si hay que hacer algo en caso de que no se cumpla ninguna de las condiciones, se detalla tras "default". Si dos casos tienen que hacer lo mismo, se añade "goto case" a uno de ellos para indicarlo.

Vamos con un ejemplo, que diga si la tecla que pulsa el usuario es una cifra numérica, un espacio u otro símbolo:

/*---------------------------*/
/*  Ejemplo en C# nº 20:     */
/*  ejemplo20.cs             */
/*                           */
/*  La orden "switch"  (1)   */
/*                           */
/*  Introduccion a C#,       */
/*    Nacho Cabanes          */
/*---------------------------*/
 
using System;
 
public class Ejemplo20
{
  public static void Main()
  {
    char letra;
 
    Console.WriteLine("Introduce una letra");
    letra = Convert.ToChar(Console.ReadLine());
 
    switch (letra)
    {
      case ' ': Console.WriteLine("Espacio.");
                break;
      case '1': goto case '0';
      case '2': goto case '0';
      case '3': goto case '0';
      case '4': goto case '0';
      case '5': goto case '0';
      case '6': goto case '0';
      case '7': goto case '0';
      case '8': goto case '0';
      case '9': goto case '0';
      case '0': Console.WriteLine("Dígito.");
                break;
      default:  Console.WriteLine("Ni espacio ni dígito.");
                break;
    }
  }
}
 

Cuidado quien venga del lenguaje C: en C se puede dejar que un caso sea manejado por el siguiente, lo que se consigue si no se usa "break", mientras que C# siempre obliga a usar "break" o "goto" en cada caso, para evitar errores difíciles de detectar. El fragmento anterior en C habría sido:

  switch (tecla)
  {
    case ' ': printf("Espacio.\n");
              break;
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
    case '8':
    case '9':
    case '0': printf("Dígito.\n");
              break;
    default:  printf("Ni espacio ni dígito.\n");
  }
 

En el lenguaje C, que es más antiguo, sólo se podía usar "switch" para comprobar valores de variables "simples" (numéricas y caracteres); en C#, que es un lenguaje más evolucionado, se puede usar también para comprobar valores de "strings". Por ejemplo, un programa que nos salude de forma personalizada si somos "Juan" o "Pedro" podría ser:

/*---------------------------*/
/*  Ejemplo en C# nº 21:     */
/*  ejemplo21.cs             */
/*                           */
/*  La orden "switch"  (2)   */
/*                           */
/*  Introduccion a C#,       */
/*    Nacho Cabanes          */
/*---------------------------*/
 
using System;
 
public class Ejemplo21
{
  public static void Main()
  {
    string nombre;
 
    Console.WriteLine("Introduce tu nombre");
    nombre = Console.ReadLine();
 
    switch (nombre)
    {
      case "Juan": Console.WriteLine("Bienvenido, Juan.");
                break;
      case "Pedro": Console.WriteLine("Que tal estas, Pedro.");
                break;          
      default:  Console.WriteLine("Procede con cautela, desconocido.");
                break;
    }
  }
}
 

Ejercicios propuestos: