1. Introduzione
Immagina di essere un barista in una caffetteria super popolare. Un cliente arriva e ti dice una delle sue cinque bevande preferite. Non ti metti a filosofeggiare, ma guardi subito il menu e rispondi: “Cappuccino? Certo! Ecco il tuo cappuccino!”. Se controllassi ogni opzione con un if separato, il tuo codice sembrerebbe una pila di tazze dopo la pausa pranzo: ingombrante e poco pratico.
L’operatore switch ti permette di controllare in modo elegante il valore di una variabile ed eseguire azioni diverse a seconda del risultato. Funziona solo con certi tipi di dati (ne parliamo tra poco), ma per la maggior parte dei menu utente, comandi semplici o riconoscimento di stati è lo strumento perfetto.
2. Sintassi classica di switch in C#
Ecco uno schema minimale di come funziona:
switch (Espressione) {
case Valore1:
// azioni
break;
case Valore2:
// azioni
break;
...
default:
// azioni di default
break;
}
Esempio 1: menu classico
Console.WriteLine("Scegli una bevanda: 1 - Caffè, 2 - Tè, 3 - Cacao");
string input = Console.ReadLine();
int choice = int.Parse(input);
switch (choice)
{
case 1:
Console.WriteLine("Hai scelto il caffè. Ottima scelta!");
break;
case 2:
Console.WriteLine("Anche il tè va bene.");
break;
case 3:
Console.WriteLine("Cacao — per chi ama il comfort!");
break;
default:
Console.WriteLine("Questa bevanda non è nel menu.");
break;
}
- Il blocco switch controlla choice per vedere se è uguale ai valori dopo case.
- Dopo ogni opzione devi scrivere break; — altrimenti l’esecuzione passa anche al case successivo (ne parliamo tra poco).
- Il blocco default è come else; viene eseguito se nessun case corrisponde.
Come funziona switch dentro? — Passo dopo passo
- Per prima cosa viene valutata l’espressione tra parentesi dopo switch (nel nostro esempio — la variabile choice).
- Il programma la confronta con ogni valore specificato (case) uno dopo l’altro.
- Se trova una corrispondenza — esegue le istruzioni di quel blocco. Poi trova break e esce dal blocco switch.
- Se non trova nessun case corrispondente, esegue il blocco default (se c’è).
Schema visivo
| Valore della variabile | case 1 | case 2 | case 3 | default |
|---|---|---|---|---|
| 1 | + | |||
| 2 | + | |||
| 3 | + | |||
| altro | + |
«+» — questo blocco viene eseguito
3. Quali tipi supporta lo switch classico?
Nella sintassi classica (cioè senza "Pattern Matching" e le nuove chicche di cui parleremo dopo!) switch supporta:
- Tipi interi semplici (int, byte, char, long, short, sbyte, ushort, uint, ulong)
- Stringhe (string)
- Enum (enum)
- Caratteri (char)
Esempio 2: switch sulle stringhe
Console.WriteLine("Scegli un comando: start, stop, pause");
string command = Console.ReadLine();
switch (command)
{
case "start":
Console.WriteLine("Il programma è avviato!");
break;
case "stop":
Console.WriteLine("Il programma è fermato.");
break;
case "pause":
Console.WriteLine("Il programma è in pausa.");
break;
default:
Console.WriteLine("Comando sconosciuto.");
break;
}
4. Perché serve break e cosa succede se lo dimentichi?
Il bug più popolare tra i programmatori alle prime armi è dimenticare break; dentro un case. Vediamo cosa succede se lo salti.
Esempio 3: caduta nel blocco successivo (fall-through)
int day = 2;
switch (day)
{
case 1:
Console.WriteLine("Lunedì");
break;
case 2:
Console.WriteLine("Martedì");
case 3:
Console.WriteLine("Mercoledì");
break;
default:
Console.WriteLine("Giorno sconosciuto");
break;
}
Cosa succede?
- In ingresso day = 2.
- Prima viene eseguita la riga: "Martedì"
- Manca break — l’esecuzione passa subito a case 3 e stampa: "Mercoledì"
- Poi trova break; — esce.
Vedrai a schermo:
Martedì
Mercoledì
Questo è un errore tipico!
- Se vuoi eseguire UNA sola azione, metti break; in ogni case.
- Se (raramente) vuoi che alcune opzioni facciano la stessa cosa, puoi “incollarle” (vedi sotto).
5. Raggruppamento dei valori case
A volte diversi valori devono comportarsi allo stesso modo. Perché copiare lo stesso codice?
Esempio 4: stessa reazione per più case
char grade = 'B';
switch (grade)
{
case 'A':
case 'B':
case 'C':
Console.WriteLine("Promosso!");
break;
case 'D':
case 'E':
Console.WriteLine("C’è spazio per migliorare.");
break;
default:
Console.WriteLine("Voto non valido.");
break;
}
Cosa succede?
- Se grade è 'A', 'B' o 'C', viene eseguito il primo blocco: "Promosso!".
- Se 'D' o 'E' — il secondo blocco.
- Se altro — default.
6. Cosa si può e cosa non si può fare nello switch classico
Si può:
- Usare letterali (costanti) nei case, tipo: case 1:, case 'A':, case "stop":.
- Confrontare enum (enumerazioni).
- Omettere default, ma di solito è utile.
Non si può:
- Usare variabili nei case (solo costanti).
- Confrontare per intervalli (case >= 5:, case x > 10: — non si può!).
- Usare double, float e altri valori decimali — solo interi, string, char, enum.
- Scrivere più valori separati da virgola in un case (case 1, 2: non si fa; scrivi più case di fila).
7. Caratteristiche e errori tipici
Nei progetti reali switch si usa spesso per menu, gestione di stati, comandi, codici di errore e mille altre cose. Ma, come ogni strumento, ha le sue particolarità.
Errori tipici:
- break dimenticato (già visto sopra).
- Tipo sbagliato nell’espressione dello switch (tipo tentare di usare double).
- Case sensitive sulle stringhe (case "Start": non corrisponde a "start") — le stringhe sono sensibili alle maiuscole/minuscole!
- Valore non gestito (hai dimenticato default, l’utente ha inserito qualcosa di strano).
Trappola con switch annidati
Anche se puoi trovare codice così, di solito è poco leggibile. Se ti accorgi che stai mettendo uno switch dentro un altro switch, forse è il momento di spostare il codice in un metodo separato o magari usare OOP/enum/array.
GO TO FULL VERSION