CodeGym /Corsi /C# SELF /Operatore switch classico

Operatore switch classico

C# SELF
Livello 10, Lezione 3
Disponibile

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;
}
Sintassi classica di switch in C#

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

  1. Per prima cosa viene valutata l’espressione tra parentesi dopo switch (nel nostro esempio — la variabile choice).
  2. Il programma la confronta con ogni valore specificato (case) uno dopo l’altro.
  3. Se trova una corrispondenza — esegue le istruzioni di quel blocco. Poi trova break e esce dal blocco switch.
  4. 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.

2
Compito
C# SELF, livello 10, lezione 3
Bloccato
Un semplice menu usando l'operatore `switch`
Un semplice menu usando l'operatore `switch`
2
Compito
C# SELF, livello 10, lezione 3
Bloccato
Determinazione del giorno della settimana
Determinazione del giorno della settimana
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION