1. Espressioni vs Istruzioni
In C# tutte le istruzioni si dividono in due categorie: istruzioni (Statement) ed espressioni (Expression). Di solito si dice che un'istruzione viene eseguita, mentre un'espressione viene valutata. Ma non è questa la cosa principale.
La differenza principale: un'espressione ha un risultato. Questo risultato ha un tipo, e puoi assegnarlo a una variabile o usarlo in un'altra espressione.
Esempi:
| Codice | Note |
|---|---|
|
Istruzione |
|
Espressione, tipo bool |
|
Espressione, tipo uguale a quello della variabile i |
|
Espressione, tipo uguale a quello della variabile x |
Cosa ci dà tutto questo?
Molte istruzioni in realtà sono espressioni (hanno un risultato). Ad esempio, questo codice funziona:int x, y, z;
x = y = z = 1; // x = (y = (z = 1));
Puoi ignorare il risultato di un'espressione se non ti serve:
Console.ReadLine(); // ignoriamo il risultato dell'input
È comodo se l'espressione, oltre al risultato, fa anche qualcosa di utile (ad esempio stampa a schermo o legge un input).
2. Operatore ternario
In C# c'è un operatore ternario (triplo) speciale. Sembra una versione compatta dell'operatore if–else:
Condizione ? Espressione1 : Espressione2;
Se Condizione è vera, viene valutata Espressione1, altrimenti Espressione2. Dopo la condizione va ?, e le due espressioni sono separate da :.
La differenza principale rispetto a if-else: l'operatore ternario è un'espressione, il suo risultato può essere assegnato a una variabile o usato in altre espressioni.
Per esempio, calcoliamo il minimo tra due numeri:
int a = 2;
int b = 3;
int min = a < b ? a : b;
Oppure assegniamo valori diversi a una variabile in base a una condizione:
int age = 25;
int money;
if (age > 30)
money = 100;
else
money = 50;
Stessa cosa con l'operatore ternario:
int age = 25;
int money = age > 30 ? 100 : 50;
Cosa è meglio usare: if-else o l'operatore ternario? In termini di velocità non cambia nulla, ma l'operatore ternario è ottimo per condizioni brevi. Se il codice non sta su una riga — meglio usare if-else per la leggibilità.
3. Particolarità d'uso
Tipi dei valori
Entrambi i rami dell'operatore ternario (<valore_se_vero> e <valore_se_falso>) devono essere dello stesso tipo o compatibili (ad esempio, entrambi string o entrambi int).
Funziona:
int a = 10, b = 20;
int max = (a > b) ? a : b; // entrambi i rami sono int
Errore di compilazione:
int a = 10, b = 20;
// string e int non sono compatibili
string result = (a > b) ? "maggiore" : 0; // Errore di compilazione
Versione corretta:
int a = 10, b = 20;
string result = (a > b) ? "maggiore" : "minore o uguale";
Esempio: lavoro con i numeri
int number = -5;
int abs = (number >= 0) ? number : -number;
Console.WriteLine(abs); // 5
4. Integrare l'operatore ternario in un'applicazione
Scriviamo una piccola app di dialogo: oltre al saluto, il programma dirà all'utente quanti anni avrà tra un anno e specificherà se sarà maggiorenne.
Console.Write("Inserisci il tuo nome: ");
string name = Console.ReadLine();
Console.Write("Inserisci la tua età: ");
string ageText = Console.ReadLine();
int age = int.Parse(ageText);
int nextYear = age + 1;
string status = (nextYear >= 18) ? "maggiorenne" : "minorenne";
Console.WriteLine($"Ciao, {name}! L'anno prossimo avrai {nextYear} anni. Sarai {status}.");
Spieghiamo i dettagli:
- La variabile status viene calcolata tramite l'operatore ternario: se l'età tra un anno è almeno 18, allora l'utente sarà maggiorenne (o lo resterà).
- L'operatore ternario si integra facilmente anche nelle stringhe (ad esempio con l'interpolazione $"").
5. Operatori ternari annidati — occhio!
L'operatore ternario può essere annidato (in ogni ramo può esserci un altro ternario). Ma... di solito fa venire il mal di testa, soprattutto a chi leggerà il codice dopo di te (anche se sei tu tra 2 giorni).
Esempio: determinare la categoria in base all'età
string category = (age < 7) ? "prescolare" :
(age < 18) ? "scolaro" :
(age < 65) ? "adulto" : "pensionato";
Tabella delle decisioni:
| Età | Condizione | Risultato |
|---|---|---|
| < 7 | age < 7 | prescolare |
| 7–17 | age < 18 | scolaro |
| 18–64 | age < 65 | adulto |
| 65 e oltre | altrimenti | pensionato |
Questo codice si può ancora leggere, ma se la logica è più complessa — meglio usare if-else if-else.
6. Lifehack: operatore ternario e tipo bool
A volte si vede questo codice:
bool adult = (age >= 18) ? true : false;
Ma è ridondante. L'espressione (age >= 18) restituisce già un bool. Quindi puoi semplicemente scrivere:
bool adult = (age >= 18);
GO TO FULL VERSION