1. Sintassi base di un if annidato
Nella vita reale è raro trovare una situazione dove la decisione si prende solo su un criterio. Di solito bisogna controllare più condizioni insieme, e spesso dipendono l'una dall'altra. Per esempio, per entrare a un concerto, non basta essere maggiorenne — a volte serve anche essere nella lista degli invitati. Qui entra in gioco la cosiddetta logica multilivello, e ci aiutano gli operatori if annidati.
Le condizioni annidate sono quando un if vive dentro un altro. Immagina una scatola dentro una scatola: se la prima scatola si apre (la condizione è vera), allora guardiamo dentro e magari apriamo la seconda. Dal punto di vista del codice e della logica è uno strumento molto potente.
Partiamo da una cosa semplice:
if (condizioneA)
{
// azioni se condizioneA è true (vero)
if (condizioneB)
{
// azioni se entrambe le condizioni sono vere
}
}
Se ti ricorda una matrioska — hai capito tutto! L'if interno viene eseguito solo se quello esterno è passato.
Esempio: ingresso in un club
Facciamo evolvere la nostra app didattica, dove l'utente prima inseriva nome ed età. Ora aggiungiamo un secondo livello di controllo: per entrare in un club privato, bisogna avere più di 21 anni e avere un codice invito.
Console.Write("Inserisci il tuo nome: ");
string name = Console.ReadLine();
Console.Write("Inserisci la tua età: ");
int age = int.Parse(Console.ReadLine());
if (age >= 21)
{
Console.Write("Inserisci il codice invito: ");
string code = Console.ReadLine();
if (code == "VIP2024")
{
Console.WriteLine("Benvenuto, " + name + ", nel VIP club!");
}
else
{
Console.WriteLine("Spiacente, codice errato. Accesso negato.");
}
}
else
{
Console.WriteLine("Spiacente, ingresso solo dai 21 anni!");
}
Nota bene: l'if interno controlla il codice solo se l'età è già stata verificata. Così risparmiamo risorse (e non facciamo innervosire il buttafuori).
2. Quanti livelli di annidamento sono accettabili?
Tecnicamente, quanti vuoi. Ma in pratica — più livelli annidi, più difficile è leggere e mantenere il codice. Di solito non si va oltre 2-3 livelli. Se ti ritrovi con "scale" di 4 o più if annidati, forse è il caso di semplificare la logica o spostare parte dei controlli in funzioni separate (ma questa è un'altra lezione!).
3. If ed else annidati: trappole e dettagli
Errore da principiante: parentesi graffe messe male.
Quando scrivi condizioni annidate, soprattutto usando else, C# segue le regole di sintassi alla lettera. Se non metti le parentesi graffe {}, solo la prima riga dopo if o else viene considerata parte di quella condizione. È una fonte classica di bug fastidiosi.
Esempio con potenziale errore:
if (age >= 21)
if (code == "VIP2024")
Console.WriteLine("Benvenuto!");
else
Console.WriteLine("Codice errato.");
Molti pensano che else si riferisca al controllo sull'età, ma in realtà si riferisce all'if più vicino (quello sul codice invito). Così i messaggi possono uscire in modo inaspettato. Meglio usare sempre le parentesi — anche se dentro c'è solo una riga!
Per evitare fraintendimenti, te lo faccio vedere ancora. Il compilatore interpreta il codice sopra così:
if (age >= 21)
{
if (code == "VIP2024")
Console.WriteLine("Benvenuto!");
else
Console.WriteLine("Codice errato.");
}
Importante! Ancora una volta:
Se nella struttura if-else non metti le parentesi graffe, else si riferisce all'if precedente (il più vicino).
4. Alternative: else if nelle condizioni annidate
A volte dentro un if esterno vuoi non solo controllare una condizione in più, ma anche prevedere un'alternativa. Per esempio, se il codice invito non va bene, puoi proporre di comprare un biglietto. Si fa con una struttura annidata else if/else:
if (age >= 21)
{
Console.Write("Inserisci il codice invito: ");
string code = Console.ReadLine();
if (code == "VIP2024")
{
Console.WriteLine("Benvenuto nel club!");
}
else if (code == "GUEST")
{
Console.WriteLine("Modalità ospite: accesso solo fino alle 23:00.");
}
else
{
Console.WriteLine("Purtroppo, accesso non possibile.");
}
}
else
{
Console.WriteLine("Ingresso solo dai 21 anni.");
}
In questo esempio abbiamo fatto una scelta annidata tra tre scenari: codice VIP, codice ospite e rifiuto.
5. Pratica: calcolatore di sconto con logica multilivello
Scriviamo un'app così: all'utente viene dato uno sconto in negozio in base all'età e alla presenza della tessera club.
- Se l'età dell'utente è maggiore o uguale a 60 — sconto 15%.
- Se l'età è minore, ma l'utente ha la tessera club — sconto 7%.
- Negli altri casi niente sconto.
Come si scrive?
Console.Write("Inserisci la tua età: ");
int age = int.Parse(Console.ReadLine());
double discount = 0.0;
if (age >= 60)
{
discount = 0.15;
}
else
{
Console.Write("Hai la tessera club (sì/no)? ");
string hasCard = Console.ReadLine();
if (hasCard == "sì")
{
discount = 0.07;
}
}
Console.WriteLine("Il tuo sconto: " + (discount * 100) + "%");
Qui abbiamo usato un if annidato dentro il ramo else. Se l'età non va bene, solo allora chiediamo della tessera.
GO TO FULL VERSION