1. Expresiones vs Sentencias
En C# todas las instrucciones se dividen en dos categorías: sentencias (Statement) y expresiones (Expression). De una sentencia se suele decir que se ejecuta, y de una expresión — que se evalúa. Pero eso no es lo principal.
La diferencia clave: una expresión tiene un resultado. Ese resultado tiene un tipo, y puedes asignarlo a una variable o usarlo en otra expresión.
Ejemplos:
| Código | Notas |
|---|---|
|
Sentencia |
|
Expresión, tipo bool |
|
Expresión, tipo igual al tipo de la variable i |
|
Expresión, tipo igual al tipo de la variable x |
¿Y esto para qué nos sirve?
Muchas sentencias en realidad son expresiones (tienen un resultado). Por ejemplo, este código funciona:int x, y, z;
x = y = z = 1; // x = (y = (z = 1));
Puedes ignorar el resultado de una expresión si no lo necesitas:
Console.ReadLine(); // ignoramos el resultado de la entrada
Esto mola si la expresión, además de devolver un resultado, hace algo útil (como mostrar algo en pantalla o leer input).
2. Operador ternario
En C# hay un operador ternario (triple) especial. Es como una versión corta del if–else:
Condición ? Expresión1 : Expresión2;
Si Condición es true, se evalúa Expresión1, si no — Expresión2. Después de la condición va ?, y las dos expresiones se separan con :.
La diferencia principal con if-else: el operador ternario es una expresión, puedes asignar su resultado a una variable o usarlo en otras expresiones.
Por ejemplo, calculemos el mínimo de dos números:
int a = 2;
int b = 3;
int min = a < b ? a : b;
O asignamos a una variable diferentes valores según la condición:
int age = 25;
int money;
if (age > 30)
money = 100;
else
money = 50;
Lo mismo con el operador ternario:
int age = 25;
int money = age > 30 ? 100 : 50;
¿Qué es mejor usar: if-else o el operador ternario? En velocidad no hay diferencia, pero el operador ternario mola para condiciones cortas. Si el código no cabe en una línea — mejor usa if-else para que sea más legible.
3. Matices de uso
Tipos de valores
Ambas ramas del operador ternario (<valor_si_true> y <valor_si_false>) deben ser del mismo tipo o compatibles (por ejemplo, ambos string o ambos int).
Funciona:
int a = 10, b = 20;
int max = (a > b) ? a : b; // ambas ramas — int
Error de compilación:
int a = 10, b = 20;
// string e int no son compatibles
string result = (a > b) ? "mayor" : 0; // Error de compilación
Opción correcta:
int a = 10, b = 20;
string result = (a > b) ? "mayor" : "menor o igual";
Ejemplo: trabajar con números
int number = -5;
int abs = (number >= 0) ? number : -number;
Console.WriteLine(abs); // 5
4. Integrando el operador ternario en una app
Vamos a escribir una pequeña app de consola: además de saludar, el programa le dirá al usuario cuántos años tendrá el año que viene y si será mayor de edad.
Console.Write("Introduce tu nombre: ");
string name = Console.ReadLine();
Console.Write("Introduce tu edad: ");
string ageText = Console.ReadLine();
int age = int.Parse(ageText);
int nextYear = age + 1;
string status = (nextYear >= 18) ? "mayor de edad" : "menor de edad";
Console.WriteLine($"¡Hola, {name}! El año que viene tendrás {nextYear}. Serás {status}.");
Detalles explicados:
- La variable status se calcula con el operador ternario: si la edad el año que viene es al menos 18, el usuario será mayor de edad (o seguirá siéndolo).
- Puedes meter el operador ternario directamente en strings (por ejemplo, usando interpolación $"").
5. Operadores ternarios anidados — ¡ojo!
Puedes anidar operadores ternarios (en cada rama puede haber otro ternario). Pero… esto suele dar dolor de cabeza, sobre todo al que lea el código después de ti (aunque seas tú dentro de 2 días).
Ejemplo: determinar categoría por edad
string category = (age < 7) ? "preescolar" :
(age < 18) ? "escolar" :
(age < 65) ? "adulto" : "jubilado";
Tabla de decisión:
| Edad | Condición | Resultado |
|---|---|---|
| < 7 | age < 7 | preescolar |
| 7–17 | age < 18 | escolar |
| 18–64 | age < 65 | adulto |
| 65 y más | si no | jubilado |
Este código aún se puede leer, pero si la lógica es más compleja — mejor usa if-else if-else.
6. Truco: operador ternario y tipo bool
A veces se ve este código:
bool adult = (age >= 18) ? true : false;
Pero esto es redundante. La expresión (age >= 18) ya devuelve bool. Así que puedes simplemente hacer:
bool adult = (age >= 18);
GO TO FULL VERSION