0Pricing
C# Academy · Lezione

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.

Tutte le lezioni di questo corso

  1. Espressioni switch
  2. Pattern di tipo e proprietà
  3. Pattern relazionali e logici
  4. Pattern di liste e tuple
← Torna a C# Academy