Lección 3 · ~12 min · ← Lección 2

Tomar decisiones: if, else, switch

Los programas se vuelven interesantes cuando reaccionan. C# tiene exactamente tres formas de elegir — la cadena, la tabla y el one-liner — y una regla de oro: las condiciones siempre son bool.

if: haz una pregunta de sí/no

int temperatura = 22;

if (temperatura > 30)
{
    Console.WriteLine("hace calor");     // no entra: 22 no es > 30
}
else
{
    Console.WriteLine("la temperatura está bien");
}

else if: una cadena de controles

La cadena corre de arriba abajo y para en la PRIMERA condición verdadera — el orden es lógica:

int puntuacion = 85;

if (puntuacion >= 90)
{
    Console.WriteLine("A");
}
else if (puntuacion >= 80)      // solo llega aquí porque >= 90 fue falso
{
    Console.WriteLine("B");
}
else if (puntuacion >= 70)
{
    Console.WriteLine("C");
}
else
{
    Console.WriteLine("F");
}

Combinar preguntas: && y ||

&& = "y" (ambos deben cumplirse). || = "o" (al menos uno). ! = "no". Hacen cortocircuito: en cuanto la respuesta es clara, el resto no se evalúa.

int dia = 6;          // sábado
bool festivo = false;

if (dia == 6 || dia == 7)
{
    Console.WriteLine("fin de semana, ¡disfruta!");
}

if (dia == 6 && !festivo)     // && necesita AMBOS lados verdaderos
{
    Console.WriteLine("tiempo de proyecto personal");
}
else
{
    Console.WriteLine("no es festivo");
}

La regla de oro: las condiciones son bool, nada más

¿Vienes de C, C++ o JavaScript? Esto pilla a todos: if (1) es un error de compilación en C#. Un número no es un valor de verdad:

int cuenta = 3;
if (cuenta)   // error CS0029: no se puede convertir 'int' a 'bool'
{
    Console.WriteLine("tres");
}
int cuenta = 3;
if (cuenta == 3)   // di lo que quieres decir: una comparación produce un bool
{
    Console.WriteLine("tres");
}

switch: un valor, muchas coincidencias exactas

Cuando comparas la MISMA expresión contra muchos constantes, switch se lee más limpio que una cadena de else if:

string pedido = "expreso";

switch (pedido)
{
    case "expreso":
        Console.WriteLine("expreso — pequeño y fuerte");
        break;
    case "latte":
    case "capuchino":              // etiquetas apiladas: dos pedidos, una receta
        Console.WriteLine("con leche y grande");
        break;
    default:
        Console.WriteLine("pedido desconocido");
        break;
}

La única ley del switch en C#: cada case no vacío termina en break;, return; o throw;. Olvidarlo es el error CS0163 — C# rechaza el "fall-through" que causó tantos bugs en C.

El ternario: un if que cabe en una expresión

int edad = 20;
string estado = edad >= 18 ? "adulto" : "menor";   // condición ? si-verdad : si-falso
Console.WriteLine(estado);
Console.WriteLine(15 >= 18 ? "adulto" : "menor");

Úsalo cuando ambas ramas producen un valor. En el momento en que te tiente anidar un ternario dentro de un ternario — escribe un if de verdad, tu yo futuro lo agradecerá.

Practica ahora