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
ifevalúa cualquier condición booleana y es ideal para comparar rangos con>,<,>=o<=.else ifencadena condiciones adicionales; solo se evalúa si todos losifanteriores fueronfalse.switchcompara una sola variable contra valores exactos; es más legible cuando hay cuatro o más casos posibles.- Siempre termina cada
caseenswitchconbreak; el compilador de C# lo exige. - Usa llaves
{}en todos tus bloquesifyelse, aunque solo contengan una línea de código.