Menu

if else en C#: cadenas else if, condiciones y errores comunes

Cómo funcionan if, else if y else en C#: por qué las condiciones deben ser bool, cómo combinar pruebas con &&, || y !, cuándo importan las llaves, cláusulas de guarda en lugar de anidar en profundidad, y los errores de = frente a == y del punto y coma suelto.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

Una sentencia if ejecuta un bloque de código solo cuando una condición es verdadera. else if añade más pruebas, y else recoge todo lo que las pruebas no cubrieron.

Salida:

Order 120: shipping 0
Order 75.50: shipping 4.99
Order 20: shipping 9.99

Las condiciones se comprueban de arriba abajo y gana la primera verdadera. Un pedido de 120 cumple >= 100 y nunca llega a la prueba >= 50, por eso la condición más específica va primero. else if no es una palabra clave aparte: es un else cuyo cuerpo es otro if, así que en C# no existe elseif ni elif.

Las condiciones deben ser bool

C# nunca trata un número, un string o un objeto como verdadero o falso. La expresión entre paréntesis debe tener tipo bool:

int count = 3;
if (count)          // error CS0029: Cannot implicitly convert type 'int' to 'bool'
if (count > 0)      // correct
if (name)           // error: a string is not a bool either
if (name != null)   // correct

Esto elimina toda una familia de bugs de C y JavaScript, donde 0, "" y null cuentan en silencio como falso. El precio es escribir la comparación completa cada vez, lo que además deja clara la intención para quien lea el código después.

Combinar condiciones con &&, || y !

&& (y), || (o) y ! (no) combinan pruebas booleanas. && y || hacen cortocircuito: el lado derecho solo se ejecuta si el izquierdo no ha decidido ya la respuesta.

Salida:

maya: welcome
invalid or banned account
invalid or banned account
omar: age 9 rejected
invalid or banned account

La llamada con null es segura gracias al cortocircuito: en cuanto username != null es false, username.Length nunca se evalúa, así que no hay NullReferenceException. Si inviertes el orden a username.Length >= 3 && username != null, la misma llamada falla.

&& tiene más precedencia que ||, así que a || b && c significa a || (b && c). Añade paréntesis siempre que mezcles los dos; el compilador no los necesita, pero los lectores sí. Los operadores de un solo carácter & y | también funcionan con bool, pero siempre evalúan ambos lados. Úsalos solo cuando el lado derecho tenga un efecto secundario que deba ocurrir.

Las llaves y la regla de una sentencia

Las llaves son opcionales cuando una rama contiene una sola sentencia. Sin ellas, solo la sentencia siguiente pertenece al if, diga lo que diga la indentación:

Salida:

Reorder email sent
Stock: 12

"Reorder email sent" se imprime aunque el stock esté bien: el segundo WriteLine está fuera del if, por mucho que esté indentado. Una guarda de una línea como if (x == null) return; está bien sin llaves; todo lo que pueda crecer a una segunda línea debería llevarlas.

Un bug parecido es un punto y coma justo después de la condición. if (stock < 5); termina el if con una sentencia vacía, y el bloque que sigue se ejecuta siempre. El compilador lo señala con la advertencia CS0642, Possible mistaken empty statement, que conviene tratar como un error.

= frente a == en una condición

= asigna, == compara. Con la mayoría de los tipos, escribir = por error no compila, porque el resultado de una asignación es el valor asignado y un int no es un bool:

int score = 10;
if (score = 100) { }   // error CS0029: Cannot implicitly convert type 'int' to 'bool'

Con una variable bool, la asignación es en sí misma un bool, así que la errata compila:

Salida:

Access granted
isAdmin is now True

La condición sobrescribió isAdmin y después probó el valor nuevo. El compilador avisa (CS0665, la asignación en una expresión condicional siempre es constante), pero la compilación termina bien. Con bools, sáltate la comparación: if (isAdmin) e if (!isAdmin) se leen mejor y no admiten esta errata.

if anidados frente a cláusulas de guarda

Cada nivel de anidamiento es otra condición que el lector tiene que tener en la cabeza. Cuando cada comprobación rechaza una entrada incorrecta, sal pronto en lugar de anidar el caso normal dentro de todas ellas:

Salida:

ordered 2 x keyboard
error: no product
error: quantity must be positive
error: insufficient balance

La versión anidada del mismo método tendría tres niveles de if con el trabajo real en el bloque más interno y tres ramas else deshaciéndose al final. Con cláusulas de guarda, cada regla está junto a su mensaje de error y la última línea es el caso normal. La misma idea funciona dentro de los bucles con continue.

Declarar variables en la condición

Una condición puede declarar una variable que está en ámbito dentro del if. Las dos formas habituales son un out var de un método TryParse y el patrón de tipo is:

Salida:

42: positive number 42
abc: not a number
-7: number -7, not positive
string of length 5

TryParse devuelve false en lugar de lanzar una excepción ante una entrada incorrecta, lo que lo hace ideal para un if. La página de conversión de tipos explica los métodos de parseo en detalle.

Cuándo usar otra cosa

  • Elegir uno de dos valores: el operador condicional condition ? a : b es más corto que un if que asigna en las dos ramas.
  • Muchas ramas sobre un mismo valor: una sentencia switch compara un valor con casos constantes y es más fácil de recorrer con la vista que diez líneas else if.
  • Asociar un valor a un resultado: una búsqueda en un Dictionary sustituye a una cadena larga cuando las ramas solo se diferencian en los datos.

Preguntas frecuentes

¿Cómo se escribe else if en C#?

Escribe else if como dos palabras: if (a) { ... } else if (b) { ... } else { ... }. Las condiciones se evalúan de arriba abajo y solo se ejecuta la primera rama verdadera, así que pon primero la prueba más específica. No existe la palabra clave elif ni elseif.

¿Por qué no puedo escribir if (count) en C#?

Una condición de C# debe ser de tipo bool. A diferencia de C y JavaScript, un int, un string o un objeto nunca se convierte en true o false, así que if (count) falla con CS0029, Cannot implicitly convert type 'int' to 'bool'. Escribe la prueba que quieres decir: if (count > 0) o if (name != null).

¿Qué diferencia hay entre && y & en una condición if?

&& hace cortocircuito: si el lado izquierdo es false, el lado derecho nunca se evalúa, y eso es lo que hace segura la expresión s != null && s.Length > 0. & con dos bool evalúa ambos lados siempre. Lo mismo vale para || y |. Usa && y || en las condiciones salvo que necesites el efecto secundario del lado derecho.

¿Son obligatorias las llaves en un if de C#?

No. Sin llaves, el if controla exactamente una sentencia. Indentar una segunda línea no la añade a la rama, lo que es una fuente clásica de bugs, por eso la mayoría de las guías de estilo recomiendan llaves en todas las ramas.

¿Puedo escribir un if else en una sola línea en C#?

Para elegir un valor, usa el operador condicional: string label = score >= 50 ? "pass" : "fail";. Para ejecutar sentencias, if (x) DoA(); else DoB(); es válido en una línea, pero es más difícil de leer y de ampliar que un bloque con llaves.

Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR