En la lección anterior viste cómo repetir acciones con bucles; antes, aprendiste a tomar decisiones con if/else if/else. Sin embargo, cuando una misma variable debe compararse contra muchos valores posibles —por ejemplo, clasificar un libro de BiblioTech según su categoría: "Novela", "Ensayo", "Poesía", "Infantil", "Ciencia"—, encadenar else if una y otra vez se vuelve repetitivo y difícil de leer. La sentencia switch resuelve exactamente ese caso: compara una expresión contra una lista de valores posibles y ejecuta el bloque que coincida, con una sintaxis más clara y ordenada.

Contenido

  1. La sentencia switch clásica
  2. case, default y la importancia de break
  3. Varios valores para un mismo case
  4. switch vs if/else if/else
  5. Un vistazo al futuro: switch expressions y pattern matching
  6. Aplicación completa: clasificar un libro por categoría

  1. La sentencia switch clásica

Un switch evalúa una expresión una sola vez y compara su resultado contra una serie de valores constantes, cada uno definido en una etiqueta case.

string categoria = "Novela";

switch (categoria)
{
    case "Novela":
        Console.WriteLine("Seccion de narrativa - Planta 1");
        break;

    case "Ensayo":
        Console.WriteLine("Seccion de no ficcion - Planta 2");
        break;

    case "Poesia":
        Console.WriteLine("Seccion de poesia - Planta 1");
        break;

    default:
        Console.WriteLine("Categoria no reconocida - consultar con el bibliotecario");
        break;
}

Estructura de la sentencia:

  • switch (expresion): la expresión se evalúa una única vez; puede ser de tipo string, cualquier tipo numérico entero, char, bool, o un enum (que se verá con detalle en módulos posteriores).
  • Cada case valor: define una posible coincidencia. Si expresion == valor, se ejecuta el bloque de código correspondiente.
  • default: se ejecuta si ninguno de los case anteriores coincide. Es equivalente al else final de una cadena if/else if/else, y aunque técnicamente es opcional, se recomienda incluirlo siempre para cubrir casos inesperados.

  1. case, default y la importancia de break

A diferencia de otros lenguajes, en C# cada bloque case debe terminar de forma explícita —normalmente con break— antes de pasar al siguiente. Si un case no contiene ninguna instrucción que termine el bloque (break, return, throw, o continuar con goto case), el compilador da un error: C# no permite el "fall-through implícito" (caer de un case al siguiente sin querer) que sí existe en lenguajes como C o Java.

Para uso cotidiano, basta con recordar la regla simple: todo case debe cerrarse con break (o con return si el switch está dentro de un método que debe devolver un valor).

string categoria = "Comic";

switch (categoria)
{
    case "Novela":
        Console.WriteLine("Narrativa");
        break;

    case "Comic":
        Console.WriteLine("Comic y novela grafica");
        break; // obligatorio: sin este break, el codigo no compila

    default:
        Console.WriteLine("Sin clasificar");
        break;
}
Elemento Obligatorio!= Función
switch (expr) Abre la estructura y define qué se va a comparar
case valor: Al menos uno (o default) Define un posible valor de coincidencia
break; Sí (por cada case con código) Termina el bloque y sale del switch
default: Recomendado, no obligatorio Cubre cualquier valor no contemplado en los case

  1. Varios valores para un mismo case

Cuando varios valores distintos deben provocar exactamente la misma acción, se pueden "apilar" varias etiquetas case seguidas, sin código entre ellas, antes del bloque común:

string categoria = "Infantil";

switch (categoria)
{
    case "Infantil":
    case "Juvenil":
        Console.WriteLine("Seccion familiar - Planta baja");
        break;

    case "Novela":
    case "Ciencia Ficcion":
    case "Fantasia":
        Console.WriteLine("Seccion de narrativa - Planta 1");
        break;

    case "Ensayo":
    case "Historia":
    case "Ciencia":
        Console.WriteLine("Seccion de no ficcion - Planta 2");
        break;

    default:
        Console.WriteLine("Categoria no reconocida");
        break;
}

Aquí, tanto "Infantil" como "Juvenil" ejecutan el mismo bloque, porque C# permite "apilar" etiquetas case sin break intermedio: solo el último case del grupo lleva el código y el break. Esto es distinto del fall-through prohibido: apilar etiquetas vacías está permitido porque no hay código entre ellas que se "salte" por error.

  1. switch vs if/else if/else

Aspecto switch if/else if/else
Comparaciones Igualdad exacta contra valores constantes Cualquier condición booleana, incluidos rangos
Legibilidad con muchos valores Alta: cada caso es una línea clara Baja: se repite la misma variable muchas veces
Rangos (paginas > 100 && paginas < 300) No directamente (requiere trucos avanzados) Sí, de forma natural
Tipos admitidos string, enteros, char, bool, enum, patrones Cualquier expresión booleana

Regla práctica: si estás comparando la misma variable contra una lista fija de valores concretos (categorías, códigos, opciones de menú), usa switch. Si necesitas evaluar rangos, combinaciones de varias variables, o condiciones más elaboradas, usa if/else if/else como en la primera lección de este módulo.

  1. Un vistazo al futuro: switch expressions y pattern matching

El switch clásico que has visto en esta lección existe desde las primeras versiones de C#. Versiones más recientes del lenguaje incorporan las llamadas switch expressions (una forma más compacta de escribir un switch que devuelve un valor directamente, sin case/break) y el pattern matching avanzado (comparar no solo valores exactos, sino también tipos, rangos o estructuras de datos completas). Como anticipo, así se ve una switch expression equivalente a uno de los ejemplos anteriores:

string categoria = "Novela";

string seccion = categoria switch
{
    "Novela" => "Narrativa - Planta 1",
    "Ensayo" => "No ficcion - Planta 2",
    "Poesia" => "Poesia - Planta 1",
    _ => "Categoria no reconocida"
};

Console.WriteLine(seccion);

Por ahora basta con reconocer esta sintaxis si la ves en código ajeno; no es necesario dominarla todavía. El Módulo 4 (Conceptos Avanzados de C#) dedica una lección completa a Pattern Matching y Características Modernas, donde profundizarás en las switch expressions, los patrones de tipo, de propiedad y de rango. Por ahora, domina bien el switch clásico: es la base sobre la que se entienden todas esas variantes modernas.

  1. Aplicación completa: clasificar un libro por categoría

Vamos a construir una pequeña utilidad de BiblioTechConsola que, dada la categoría de un libro, determina en qué planta se ubica físicamente y muestra un mensaje descriptivo.

string[] categoriasLibros = { "Novela", "Comic", "Ensayo", "Infantil", "Manga", "Desconocida" };

foreach (string categoria in categoriasLibros)
{
    string ubicacion;

    switch (categoria)
    {
        case "Novela":
        case "Ciencia Ficcion":
        case "Fantasia":
            ubicacion = "Planta 1 - Narrativa";
            break;

        case "Ensayo":
        case "Historia":
            ubicacion = "Planta 2 - No ficcion";
            break;

        case "Infantil":
        case "Juvenil":
            ubicacion = "Planta baja - Seccion familiar";
            break;

        case "Comic":
        case "Manga":
            ubicacion = "Planta 1 - Comic y novela grafica";
            break;

        default:
            ubicacion = "Sin ubicacion asignada - revisar con el bibliotecario";
            break;
    }

    Console.WriteLine($"{categoria} -> {ubicacion}");
}

Salida esperada:

Novela -> Planta 1 - Narrativa
Comic -> Planta 1 - Comic y novela grafica
Ensayo -> Planta 2 - No ficcion
Infantil -> Planta baja - Seccion familiar
Manga -> Planta 1 - Comic y novela grafica
Desconocida -> Sin ubicacion asignada - revisar con el bibliotecario

Observa cómo el switch deja el código mucho más ordenado que una larga cadena de else if comparando siempre la misma variable categoria.

Errores Comunes y Consejos

  • Olvidar el break: en C# no compila un case con código que no termine en break (u otra instrucción de salida como return). El compilador te avisará con un error claro; no lo interpretes como un capricho del lenguaje, sino como una protección contra el error de fall-through accidental tan común en otros lenguajes.
  • Duplicar un valor de case: dos etiquetas case con el mismo valor no compilan. Revisa que cada valor aparezca una sola vez.
  • Olvidar el default: aunque no es obligatorio, omitirlo puede dejar situaciones sin cubrir. En BiblioTechConsola, un default bien pensado ("categoría no reconocida") evita comportamientos silenciosos e inesperados.
  • Usar switch para rangos numéricos (paginas > 100 && paginas < 300): el switch clásico compara igualdad exacta, no rangos; para eso, usa if/else if/else.
  • Mezclar tipos de valores en los case: todos los valores de los case deben ser compatibles con el tipo de la expresión del switch (si compara un string, todos los case deben ser cadenas literales).

Ejercicios

  1. Declara int diaSemana con un valor del 1 al 7. Escribe un switch que muestre por consola el nombre del día correspondiente (1 -> "Lunes", ..., 7 -> "Domingo"), y un mensaje "Dia invalido" en el default.

  2. Declara string formato con uno de estos valores: "Tapa dura", "Tapa blanda", "Digital", "Audiolibro". Usando case apilados, agrupa "Tapa dura" y "Tapa blanda" bajo el mensaje "Formato fisico", y agrupa "Digital" y "Audiolibro" bajo el mensaje "Formato electronico".

  3. Dado el array string[] categorias = { "Poesia", "Terror", "Novela" };, recorre el array con foreach y, para cada categoría, usa un switch para mostrar "Planta 1" si es "Novela" o "Poesia", y "Sin clasificar" en cualquier otro caso (incluido "Terror", que no está contemplado explícitamente).

Soluciones

int diaSemana = 3;

switch (diaSemana)
{
    case 1:
        Console.WriteLine("Lunes");
        break;
    case 2:
        Console.WriteLine("Martes");
        break;
    case 3:
        Console.WriteLine("Miercoles");
        break;
    case 4:
        Console.WriteLine("Jueves");
        break;
    case 5:
        Console.WriteLine("Viernes");
        break;
    case 6:
        Console.WriteLine("Sabado");
        break;
    case 7:
        Console.WriteLine("Domingo");
        break;
    default:
        Console.WriteLine("Dia invalido");
        break;
}

Con diaSemana = 3, el resultado mostrado es "Miercoles".

string formato = "Digital";

switch (formato)
{
    case "Tapa dura":
    case "Tapa blanda":
        Console.WriteLine("Formato fisico");
        break;

    case "Digital":
    case "Audiolibro":
        Console.WriteLine("Formato electronico");
        break;

    default:
        Console.WriteLine("Formato no reconocido");
        break;
}

Con formato = "Digital", el resultado mostrado es "Formato electronico".

string[] categorias = { "Poesia", "Terror", "Novela" };

foreach (string categoria in categorias)
{
    switch (categoria)
    {
        case "Novela":
        case "Poesia":
            Console.WriteLine("Planta 1");
            break;

        default:
            Console.WriteLine("Sin clasificar");
            break;
    }
}

El resultado mostrado es: "Planta 1" (para "Poesia"), "Sin clasificar" (para "Terror", que cae en el default al no estar contemplado) y "Planta 1" (para "Novela").

Conclusión

En esta lección has aprendido a usar switch para comparar una misma variable contra una lista de valores posibles de forma clara y ordenada, la importancia del break en cada case, cómo agrupar varios valores bajo una misma acción, y cuándo elegir switch frente a if/else if/else. También has visto un breve adelanto de las switch expressions y el pattern matching moderno, que retomarás en profundidad en el Módulo 4.

Hasta ahora, en todos los ejemplos de este módulo, el código ha asumido que los datos llegan en el formato correcto. Pero en un programa real, cualquier operación —convertir texto a número, acceder a una posición de un array, prestar un libro que no existe— puede fallar. En la última lección de este módulo, Manejo de Excepciones, aprenderás a anticipar y gestionar esos errores de forma controlada con try/catch/finally, para que BiblioTechConsola no se detenga bruscamente ante un dato inesperado.

Curso de Programación en C#

Módulo 1: Introducción a C#

Módulo 2: Estructuras de Control

Módulo 3: Programación Orientada a Objetos

Módulo 4: Conceptos Avanzados de C#

Módulo 5: Trabajando con Datos

Módulo 6: Temas Avanzados

Módulo 7: Construcción de Aplicaciones

Módulo 8: Mejores Prácticas y Patrones de Diseño

Módulo 9: Proyecto Final

© Copyright 2026. Todos los derechos reservados