certmundo.
es‑mx

6 min de lectura

¿Cómo controlar el flujo de un programa con if y switch en C#?

Las estructuras if y switch le permiten a tu programa tomar decisiones y ejecutar diferentes bloques de código según una condición.

Sin estas estructuras, tu programa solo ejecutaría instrucciones de arriba hacia abajo, siempre igual. Con if y switch, puedes validar datos del SAT, verificar requisitos del IMSS o aplicar descuentos en Liverpool.

La estructura if / else if / else

La instrucción if evalúa una condición booleana. Si la condición es true, ejecuta el bloque de código entre llaves. Si es false, lo omite.

Sintaxis básica:

if (condición)
{
    // código si la condición es verdadera
}
else if (otraCondición)
{
    // código si la segunda condición es verdadera
}
else
{
    // código si ninguna condición fue verdadera
}

Puedes tener cero o varios bloques else if. El bloque else es opcional, pero captura todos los casos que no cumplieron ninguna condición anterior.

Ejemplo 1 — Validar edad para el IMSS

El IMSS clasifica a los asegurados por grupo de edad para ciertos trámites. Este programa determina la categoría:

int edad = 45;

if (edad < 18)
{
    Console.WriteLine("Menor de edad: requiere tutor para el trámite.");
}
else if (edad >= 18 && edad <= 64)
{
    Console.WriteLine("Adulto: puede realizar el trámite en línea.");
}
else
{
    Console.WriteLine("Adulto mayor: atención preferencial en ventanilla.");
}

Salida:

Adulto: puede realizar el trámite en línea.

Observa el operador &&. La condición edad >= 18 && edad <= 64 solo es true cuando las dos partes son verdaderas al mismo tiempo.

Ejemplo 2 — Calcular ISR simplificado del SAT

El SAT aplica tasas distintas según el ingreso mensual. Este ejemplo usa rangos de salario para mostrar el porcentaje de ISR aproximado:

decimal salario = 18500;
string tasaISR;

if (salario <= 8952)
{
    tasaISR = "1.92%";
}
else if (salario <= 12500)
{
    tasaISR = "6.40%";
}
else if (salario <= 20000)
{
    tasaISR = "10.88%";
}
else
{
    tasaISR = "16.00% o más";
}

Console.WriteLine($"Salario: ${salario:N0}");
Console.WriteLine($"Tasa ISR estimada: {tasaISR}");

Salida:

Salario: $18,500
Tasa ISR estimada: 10.88%

Usar decimal para el salario garantiza que las comparaciones con montos sean precisas. El formato :N0 en la interpolación de cadenas muestra el número con separador de miles.

La estructura switch

switch es ideal cuando una sola variable puede tener muchos valores posibles y cada valor requiere una acción diferente. Es más limpio que escribir muchos else if seguidos.

Sintaxis básica:

switch (variable)
{
    case valor1:
        // código para valor1
        break;
    case valor2:
        // código para valor2
        break;
    default:
        // código si ningún case coincide
        break;
}

La palabra break es obligatoria al final de cada caso. Sin ella, el compilador de C# lanza un error. El bloque default funciona igual que else: se ejecuta cuando ningún case coincide.

Ejemplo 3 — Estado de una entrega en Mercado Libre

Imagina que recibes el código de estado de un envío. Según el código, muestras un mensaje al comprador:

string estado = "EN_CAMINO";

switch (estado)
{
    case "PENDIENTE":
        Console.WriteLine("Tu pedido aún no ha sido enviado.");
        break;
    case "EN_CAMINO":
        Console.WriteLine("Tu paquete va en camino. Llegará en 1-2 días.");
        break;
    case "ENTREGADO":
        Console.WriteLine("Paquete entregado. ¡Califica tu experiencia!");
        break;
    case "CANCELADO":
        Console.WriteLine("Tu pedido fue cancelado. El reembolso tarda 3 días.");
        break;
    default:
        Console.WriteLine("Estado desconocido. Contacta a soporte.");
        break;
}

Salida:

Tu paquete va en camino. Llegará en 1-2 días.

Usar switch aquí es más legible que cuatro bloques else if consecutivos con la misma variable.

Ejemplo 4 — Descuento por nivel de cliente en Liverpool

Liverpool tiene diferentes niveles de membresía. Cada nivel aplica un porcentaje de descuento distinto sobre el total de compra:

string nivel = "ORO";
decimal totalCompra = 3200;
decimal descuento = 0;

switch (nivel)
{
    case "CLÁSICO":
        descuento = 0.05m;
        break;
    case "PLATA":
        descuento = 0.10m;
        break;
    case "ORO":
        descuento = 0.15m;
        break;
    case "PLATINO":
        descuento = 0.20m;
        break;
    default:
        descuento = 0;
        break;
}

decimal montoDescuento = totalCompra * descuento;
decimal totalFinal = totalCompra - montoDescuento;

Console.WriteLine($"Nivel: {nivel}");
Console.WriteLine($"Descuento aplicado: ${montoDescuento:N0}");
Console.WriteLine($"Total a pagar: ${totalFinal:N0}");

Salida:

Nivel: ORO
Descuento aplicado: $480
Total a pagar: $2,720

Nota que la lógica de cálculo ocurre después del switch. El switch solo asigna el porcentaje; las operaciones aritméticas van fuera.

if vs switch — ¿Cuándo usar cada uno?

Situación Usa if Usa switch
Comparar rangos numéricos (>, <)
Comparar una variable con valores exactos ✅ (más limpio)
Combinar condiciones con && o ||
Más de 4 valores posibles de una variable Funciona, pero es verboso
Condiciones sobre tipos string o int exactos

La regla práctica: si usas operadores de comparación como > o <=, elige if. Si comparas igualdad exacta contra muchos valores posibles, elige switch.

Errores comunes

Error 1 — Olvidar el break en switch

En otros lenguajes como C, omitir break hace que el programa continúe al siguiente caso. En C#, el compilador simplemente no permite eso y muestra un error. Siempre termina cada case con break.

Error 2 — Usar = en lugar de == dentro del if

// ❌ Incorrecto: esto asigna, no compara
if (edad = 18)

// ✅ Correcto: esto compara
if (edad == 18)

C# detecta este error en tiempo de compilación para tipos int, pero es un hábito que debes corregir desde el principio.

Error 3 — Condiciones que nunca se alcanzan

// ❌ El segundo if nunca se ejecuta
if (salario > 10000)
{
    Console.WriteLine("Salario alto");
}
else if (salario > 15000)  // imposible: ya pasó el primer if
{
    Console.WriteLine("Salario muy alto");
}

Ordena siempre tus condiciones del rango más restrictivo al más general, o del valor más alto al más bajo, según tu lógica.

Error 4 — No usar llaves en bloques de una sola línea

// ❌ Riesgoso: solo la primera línea pertenece al if
if (edad >= 18)
    Console.WriteLine("Mayor de edad.");
    Console.WriteLine("Puede continuar.");  // siempre se ejecuta

// ✅ Correcto: ambas líneas dentro del bloque
if (edad >= 18)
{
    Console.WriteLine("Mayor de edad.");
    Console.WriteLine("Puede continuar.");
}

Aunque C# permite omitir llaves cuando el bloque tiene una sola instrucción, usar llaves siempre es la práctica más segura.

Resumen de estructuras

Estructura Evalúa Mejor para
if Cualquier condición booleana Rangos, condiciones combinadas
else if Condición adicional Múltiples rangos encadenados
else Ningún caso anterior fue true Caso por defecto en if
switch Igualdad exacta de una variable Muchos valores posibles
default Ningún case coincidió Caso por defecto en switch

Puntos clave

  • if evalúa cualquier condición booleana y es ideal para comparar rangos con >, <, >= o <=.
  • else if encadena condiciones adicionales; solo se evalúa si todos los if anteriores fueron false.
  • switch compara una sola variable contra valores exactos; es más legible cuando hay cuatro o más casos posibles.
  • Siempre termina cada case en switch con break; el compilador de C# lo exige.
  • Usa llaves {} en todos tus bloques if y else, aunque solo contengan una línea de código.

Puntos clave

  • `if` evalúa cualquier condición booleana y ejecuta un bloque de código cuando el resultado es `true`. Es la herramienta correcta para comparar rangos numéricos como rangos de salario del SAT.
  • `else if` y `else` encadenan condiciones alternativas. Solo se ejecuta el primer bloque cuya condición sea `true`; los demás se omiten.
  • `switch` compara una variable contra valores exactos. Es más limpio que varios `else if` cuando la variable puede tener muchos valores posibles, como estados de envío o niveles de membresía.
  • Cada `case` en un `switch` debe terminar con `break`. Sin él, C# lanza un error de compilación.
  • Usa siempre llaves `{}` en tus bloques `if`, `else` y `switch` para evitar errores difíciles de detectar cuando agregas más líneas de código.

Comparte esta lección:

¿Cómo controlar el flujo de un programa con if y switch en C#? | C# Básico: Aprende a Programar desde Cero | Certmundo