Espressioni switch
Switch concisi che restituiscono valori.
Espressioni switch è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 4 lezioni in totale.
Che cos'è un'espressione switch?
Una espressione switch valuta un input rispetto a una serie di pattern e restituisce un valore. A differenza della classica istruzione switch, è un'espressione, quindi produce un risultato che può essere assegnato o restituito.
Usa la parola chiave switch dopo il valore, con rami scritti nella forma pattern => result. Questo rende la logica condizionale compatta e funzionale.
int code = 2;
string name = code switch
{
1 => "One",
2 => "Two",
_ => "Other"
};
System.Console.WriteLine(name);Istruzione ed espressione a confronto
La vecchia istruzione switch usa le etichette case e break. La più recente espressione switch elimina completamente queste parole chiave.
I rami sono separati da virgole, l'intera espressione termina con un punto e virgola e ogni ramo produce un valore invece di eseguire blocchi con prosecuzione automatica. In questo modo si elimina un'intera categoria di bug causati dall'aver dimenticato break.
// Statement style
switch (code) { case 1: result = "One"; break; }
// Expression style
result = code switch { 1 => "One", _ => "?" };Il ramo discard
Il carattere di sottolineatura _ è il discard pattern, ovvero il pattern di scarto. Corrisponde a qualsiasi valore e svolge il ruolo del caso predefinito.
Le espressioni switch devono essere esaustive: se durante l'esecuzione nessun ramo corrisponde, viene generata una SwitchExpressionException. Aggiungendo un ramo con _ si garantisce una corrispondenza per ogni input possibile.
using System;
class Program {
static void Main() {
int n = 7;
string size = n switch {
< 5 => "small",
_ => "big"
};
Console.WriteLine(size);
}
}Pattern costanti
Il ramo più semplice usa un pattern costante: un valore letterale con cui l'input viene confrontato usando l'uguaglianza.
Le costanti possono essere numeri, stringhe, caratteri, membri di enum o costanti denominate. Vengono valutate dall'alto verso il basso, quindi è opportuno mettere prima i rami più specifici o più comuni.
char grade = 'B';
string label = grade switch
{
'A' => "Excellent",
'B' => "Good",
'C' => "Fair",
_ => "Needs work"
};
System.Console.WriteLine(label);Restituire un valore da un metodo
Le espressioni switch sono particolarmente efficaci all'interno dei metodi. Poiché l'intera costruzione è un'espressione, è possibile restituirla direttamente, spesso come metodo con corpo espresso su una sola riga.
Questo mantiene la logica di mappatura leggibile e centralizzata, invece di distribuirla in varie catene di if/else if nel corpo del metodo.
using System;
class Program {
static string Day(int d) => d switch {
0 => "Sun", 6 => "Sat", _ => "Weekday"
};
static void Main() => Console.WriteLine(Day(6));
}Usare gli enum con switch
Gli enum si abbinano naturalmente alle espressioni switch. Ogni ramo indica un membro dell'enum e il compilatore può segnalare l'assenza di un caso se si omette il ramo discard.
Tuttavia, è consigliabile mantenere un ramo con _, così eventuali valori futuri dell'enum non causeranno il blocco dell'applicazione durante l'esecuzione.
using System;
enum Light { Red, Yellow, Green }
class Program {
static void Main() {
Light l = Light.Green;
string action = l switch {
Light.Red => "Stop",
Light.Yellow => "Slow",
Light.Green => "Go",
_ => "?"
};
Console.WriteLine(action);
}
}Clausole di guardia con when
Una guardia when aggiunge una condizione booleana a un ramo. Il ramo corrisponde solo se sono veri sia il pattern sia la guardia.
In questo modo è possibile affinare le corrispondenze con una logica arbitraria che un semplice pattern non può esprimere, ad esempio controlli di intervallo combinati con altre variabili.
int temp = 30;
string weather = temp switch
{
int t when t < 0 => "Freezing",
int t when t < 20 => "Cool",
_ => "Warm"
};
System.Console.WriteLine(weather);L'ordine è importante
I rami vengono valutati nell'ordine in cui compaiono nel codice. Vince il primo ramo corrispondente, quindi i pattern più specifici devono precedere quelli più generali.
Se un ramo generale precede uno specifico, il compilatore segnala il ramo successivo come irraggiungibile. Legga i rami dall'alto verso il basso, come un imbuto che va dal più stretto al più ampio.
int score = 95;
string tier = score switch
{
>= 90 => "Gold",
>= 70 => "Silver",
_ => "Bronze"
};
System.Console.WriteLine(tier);Esaustività ed eccezioni
Se non tutti gli input sono coperti e nessun ramo corrisponde, il runtime genera System.Runtime.CompilerServices.SwitchExpressionException.
Il compilatore emette l'avviso CS8509 quando non può dimostrare che l'espressione sia esaustiva. Prenda sul serio questo avviso: aggiunga un ramo discard oppure copra i valori mancanti per mantenere completa l'espressione.
using System;
class Program {
static void Main() {
try {
int x = 5;
string s = x switch { 1 => "a", 2 => "b" };
Console.WriteLine(s);
} catch (Exception e) {
Console.WriteLine(e.GetType().Name);
}
}
}Combinare più input
Per eseguire lo switch su più valori, li racchiuda in una tupla. I rami corrisponderanno quindi a pattern di tupla, confrontando ogni posizione.
Questa soluzione è ideale per macchine a stati o tabelle decisionali in cui il risultato dipende da una coppia di fattori. I pattern di tupla verranno esaminati in dettaglio in una lezione successiva.
bool isWeekend = true; bool isRaining = false;
string plan = (isWeekend, isRaining) switch
{
(true, false) => "Go hiking",
(true, true) => "Watch a movie",
_ => "Work"
};
System.Console.WriteLine(plan);Corpi di espressione leggibili
Le espressioni switch si combinano bene con LINQ e con i membri con corpo espresso, producendo pipeline concise.
Poiché ogni ramo restituisce un valore, è possibile usare un'espressione switch direttamente all'interno di una proiezione Select o come argomento di un metodo, evitando variabili temporanee.
using System;
using System.Linq;
class Program {
static void Main() {
var nums = new[] { 1, 2, 3 };
var labels = nums.Select(n => n switch {
1 => "one", 2 => "two", _ => "many"
});
Console.WriteLine(string.Join(",", labels));
}
}Verifica rapida
Verifichi la Sua comprensione delle espressioni switch.
Riepilogo
Le espressioni switch restituiscono un valore usando input switch { pattern => result, ... }, con rami separati da virgole.
Usi _ come caso predefinito e when per le guardie, ricordando che i rami vengono valutati dall'alto verso il basso. Si assicuri che siano esaustivi per evitare eccezioni durante l'esecuzione. Nella prossima lezione esamineremo i pattern di tipo e di proprietà.
Domande Frequenti
La lezione «Espressioni switch» è gratuita?
Sì — il testo completo di «Espressioni switch» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 4 lezioni in totale.
Cosa imparerò in «Espressioni switch»?
Switch concisi che restituiscono valori. Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare C# Academy?
Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «Espressioni switch»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione C# Academy?
Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.