Istruzione switch in C#
- L'istruzione
switch
è una struttura di selezione multipla che consente di eseguire diverse parti di codice in base al valore di un'espressione. - Il selettore dell'istruzione
switch
deve essere un'espressione che restituisce un valore confrontabile, come un numero intero, una stringa o un enum. - Le etichette
case
all'interno di unswitch
devono essere uniche e non possono essere ripetute. - Ogni
case
termina con un'istruzionebreak
, che termina l'esecuzione del caso corrente e salta al di fuori della strutturaswitch
. - Se non viene trovata alcuna corrispondenza tra il selettore e le etichette
case
, viene eseguito il bloccodefault
, se presente. - È possibile utilizzare etichette multiple per eseguire la stessa struttura di codice in più casi.
- L'istruzione
switch
è utile per gestire situazioni in cui si desidera selezionare tra molte opzioni in modo chiaro e leggibile.
Selezione Multipla con switch
La struttura di selezione switch-case
sceglie quale parte del codice del programma eseguire in base al valore calcolato di una certa espressione (molto spesso di tipo intero).
Il formato tipico della struttura switch è il seguente:
switch (selettore_intero)
{
case valore_intero_1:
istruzioni;
break;
case valore_intero_2:
istruzioni;
break;
/* ... altri case ... */
default:
istruzioni;
break;
}
Il selettore
è un'espressione che restituisce un valore risultante che può essere confrontato, come un numero o una stringa.
L'istruzione switch
confronta il risultato del selettore con ogni valore elencato nelle etichette case
nel corpo della struttura switch
. Se viene trovata una corrispondenza in un'etichetta case
, la struttura corrispondente viene eseguita (semplice o complessa che sia).
Se non viene trovata alcuna corrispondenza, viene eseguita il caso default
(quando quest'ultimo esiste). Se il caso default
non esiste, il programma continua semplicemente l'esecuzione dopo la struttura switch
.
Il valore del selettore deve essere calcolato prima di confrontarlo con i valori all'interno della struttura switch
. Le etichette non devono avere valori ripetuti, devono essere uniche.
Come si può vedere dalla definizione sopra, ogni case
termina con l'istruzione break
, che termina il corpo del singolo caso.
Il compilatore C# richiede la parola break
alla fine di ogni sezione case
contenente codice. Se non viene trovato codice dopo un'istruzione case
, il break
può essere omesso e l'esecuzione passa alla successiva istruzione case
e continua fino a quando non trova un operatore break
. Dopo la struttura default
il break
è obbligatorio.
Non è necessario che la clausola default
sia ultima, ma è raccomandato metterla alla fine, e non nel mezzo della struttura switch
. Questo per motivi di leggibilità e per evitare confusione.
Alcune restrizioni sull'istruzione switch
L'istruzione switch
è un modo chiaro per implementare la selezione tra molte opzioni (ovvero, una scelta tra alcuni modi alternativi per eseguire il codice).
Richiede un selettore, che viene calcolato a un certo valore. Il tipo di selettore potrebbe essere un numero intero, char
, string
o enum
.
Tuttavia non possiamo adoperare un array o un'espressione in virgola mobile (come float
o double
). Per i tipi di dati non interi, dovremmo usare una serie di istruzioni if
.
Esempio di Istruzione switch
Proviamo a implementare un semplice esempio di istruzione switch
in C#. Vogliamo realizzare un programma che stampa il nome del giorno della settimana in base al numero del giorno (1 per Lunedì, 2 per Martedì, e così via). Nel caso in cui il numero non corrisponda a nessun giorno della settimana, il programma stamperà "Giorno non valido"
.
int giorno;
Console.WriteLine("Inserisci un numero da 1 a 7 per il giorno della settimana:");
giorno = Convert.ToInt32(Console.ReadLine());
switch (giorno)
{
case 1:
Console.WriteLine("Lunedì");
break;
case 2:
Console.WriteLine("Martedì");
break;
case 3:
Console.WriteLine("Mercoledì");
break;
case 4:
Console.WriteLine("Giovedì");
break;
case 5:
Console.WriteLine("Venerdì");
break;
case 6:
Console.WriteLine("Sabato");
break;
case 7:
Console.WriteLine("Domenica");
break;
default:
Console.WriteLine("Giorno non valido");
break;
}
In questo esempio, il programma chiede all'utente di inserire un numero da 1 a 7. A seconda del numero inserito, il programma stampa il nome del giorno corrispondente. Se l'utente inserisce un numero al di fuori di questo intervallo, viene stampato "Giorno non valido"
. Quest'ultimo caso è gestito dalla clausola default
.
Se proviamo a eseguire il programma e inseriamo il numero 3, otterremo il seguente output:
Inserisci un numero da 1 a 7 per il giorno della settimana:
3
Mercoledì
Utilizzo di Etichette Multiple
Utilizzare etichette multiple è appropriato quando vogliamo eseguire la stessa struttura in più di un caso.
Ad esempio, realizziamo un programma che determina se il giorno della settimana è un giorno lavorativo o un giorno festivo. Consideriamo i giorni da 1 a 5 (ossia da Lunedì a Venerdì) come giorni lavorativi e i giorni 6 e 7 (Sabato e Domenica) come giorni festivi.
int giorno;
Console.WriteLine("Inserisci un numero da 1 a 7 per il giorno della settimana:");
giorno = Convert.ToInt32(Console.ReadLine());
switch (giorno)
{
case 1: // Lunedì
case 2: // Martedì
case 3: // Mercoledì
case 4: // Giovedì
case 5: // Venerdì
Console.WriteLine("È un giorno lavorativo.");
break;
case 6: // Sabato
case 7: // Domenica
Console.WriteLine("È un giorno festivo.");
break;
default:
Console.WriteLine("Giorno non valido");
break;
}
Nel esempio sopra, implementiamo etichette multiple utilizzando istruzioni case
senza break
dopo di esse.
In questo caso, se l'utente inserisce un numero da 1 a 5, il programma stamperà "È un giorno lavorativo."
, mentre se inserisce 6 o 7, stamperà "È un giorno festivo."
. Se l'utente inserisce un numero al di fuori dell'intervallo da 1 a 7, il programma stamperà "Giorno non valido"
.
Poiché le istruzioni case
1, 2, 3, 4 e 5 non hanno un'istruzione break
tra di loro, se il selettore corrisponde a uno di questi valori, il programma eseguirà la stessa istruzione fino a quando non incontra un'istruzione break
o la fine della struttura switch
.
Consigli per l'uso dell'istruzione switch
- Una buona prassi quando si usa l'istruzione
switch
è mettere l'istruzionedefault
alla fine, per avere un codice più facile da leggere. - È buona norma posizionare prima i
case
, che gestiscono le situazioni più comuni. Le istruzionicase
, che gestiscono situazioni che si verificano raramente, possono essere posizionate alla fine della struttura. - Se i valori nelle etichette
case
sono interi, si raccomanda che siano ordinati in ordine crescente. - Se i valori nelle etichette
case
sono di tipo carattere, si raccomanda che le etichettecase
siano ordinate alfabeticamente. - È consigliabile usare sempre un blocco
default
per gestire situazioni che non possono essere elaborate nel normale funzionamento del programma. Se nel normale funzionamento del programma il bloccodefault
non dovrebbe essere raggiungibile, si potrebbe inserire un codice che segnala un errore.