C# Academy · leksjon

switch-uttrykk

Konsise switch-uttrykk som returnerer verdier.

Leksjon 1 av 413 trinn

switch-uttrykk er en gratis leksjon i C# Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i C# Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i C# Academy inneholder totalt 4 leksjoner.

Hva er et switch-uttrykk

Et switch-uttrykk evaluerer inndata mot en serie mønstre og returnerer en verdi. I motsetning til den klassiske switch-setningen er det et uttrykk, så det produserer et resultat som kan tilordnes eller returneres.

Det bruker nøkkelordet switch etter verdien, med armer skrevet som pattern => result. Dette gjør forgreningslogikk kompakt og funksjonell.

int code = 2;
string name = code switch
{
    1 => "One",
    2 => "Two",
    _ => "Other"
};
System.Console.WriteLine(name);

Setning kontra uttrykk

Den gamle switch-setningen bruker case-etiketter og break. Det nyere switch-uttrykket utelater disse nøkkelordene helt.

Armer skilles med komma, hele uttrykket avsluttes med semikolon, og hver arm gir en verdi i stedet for å kjøre blokker med gjennomfall. Dette fjerner en hel klasse av feil som skyldes glemte break.

// Statement style
switch (code) { case 1: result = "One"; break; }

// Expression style
result = code switch { 1 => "One", _ => "?" };

Forkastingsarmen

Understreken _ er forkastingsmønsteret. Den samsvarer med alt og fungerer som standardtilfellet.

Switch-uttrykk må være uttømmende: Hvis ingen arm samsvarer under kjøring, kastes en SwitchExpressionException. En _-arm garanterer et treff for alle mulige inndata.

using System;

class Program {
    static void Main() {
        int n = 7;
        string size = n switch {
            < 5 => "small",
            _ => "big"
        };
        Console.WriteLine(size);
    }
}

Konstantmønstre

Den enkleste armen bruker et konstantmønster: en bokstavelig verdi som inndataene sammenlignes med ved hjelp av likhet.

Konstanter kan være tall, strenger, tegn, enum-medlemmer eller navngitte konstanter. De evalueres ovenfra og ned, så plasser de mest spesifikke eller vanligste armene først.

char grade = 'B';
string label = grade switch
{
    'A' => "Excellent",
    'B' => "Good",
    'C' => "Fair",
    _   => "Needs work"
};
System.Console.WriteLine(label);

Returnere fra en metode

Switch-uttrykk er spesielt nyttige i metoder. Fordi hele konstruksjonen er et uttrykk, kan det returneres direkte, ofte som en metode med uttrykkskropp på én linje.

Dette holder mapperingslogikken lesbar og sentralisert i stedet for å spre if/else if-kjeder rundt i kroppen.

using System;

class Program {
    static string Day(int d) => d switch {
        0 => "Sun", 6 => "Sat", _ => "Weekday"
    };
    static void Main() => Console.WriteLine(Day(6));
}

Switch-uttrykk med enum-er

Enum-er passer naturlig sammen med switch-uttrykk. Hver arm angir et enum-medlem, og kompilatoren kan advare når et tilfelle mangler hvis forkastingsarmen utelates.

Det er likevel lurt å beholde en _-arm, slik at fremtidige enum-verdier ikke får appen til å krasje under kjøring.

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);
    }
}

Guard-betingelser med when

En when-betingelse legger til en boolsk betingelse i en arm. Armen samsvarer bare når både mønsteret og betingelsen er sanne.

Dette gjør det mulig å presisere treff med vilkårlig logikk som et mønster alene ikke kan uttrykke, for eksempel intervallsjekker kombinert med andre variabler.

int temp = 30;
string weather = temp switch
{
    int t when t < 0  => "Freezing",
    int t when t < 20 => "Cool",
    _                 => "Warm"
};
System.Console.WriteLine(weather);

Rekkefølgen er viktig

Armer testes i kildekoderekkefølgen. Den første samsvarende armen vinner, så mer spesifikke mønstre må komme før bredere mønstre.

Hvis en generell arm står foran en spesifikk, rapporterer kompilatoren den senere armen som utilgjengelig. Les armene ovenfra og ned som en trakt fra smal til bred.

int score = 95;
string tier = score switch
{
    >= 90 => "Gold",
    >= 70 => "Silver",
    _     => "Bronze"
};
System.Console.WriteLine(tier);

Uttømmende mønstre og unntak

Hvis ikke alle inndata er dekket og ingen arm samsvarer, kaster kjøretiden System.Runtime.CompilerServices.SwitchExpressionException.

Kompilatoren utsteder advarsel CS8509 når den ikke kan bevise at uttrykket er uttømmende. Ta advarselen på alvor: Legg til en forkastingsarm eller dekk de manglende verdiene for å holde uttrykket totalt.

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);
        }
    }
}

Kombinere flere inndata

For å bytte basert på mer enn én verdi pakkes verdiene inn i en tuppel. Armene samsvarer deretter med tuppelmønstre og sammenligner hver posisjon.

Dette passer godt for tilstandsmaskiner eller beslutningstabeller der resultatet avhenger av et par faktorer. Tuppelmønstre utforskes grundig i en senere leksjon.

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);

Lesbare uttrykkskropper

Switch-uttrykk fungerer godt sammen med LINQ og medlemmer med uttrykkskropp, og gir konsise arbeidsflyter.

Fordi hver arm returnerer en verdi, kan et switch-uttrykk brukes direkte i en Select-projeksjon eller som et metodeargument, uten midlertidige variabler.

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));
    }
}

Kort test

Test forståelsen av switch-uttrykk.

Oppsummering

Switch-uttrykk returnerer en verdi ved hjelp av input switch { pattern => result, ... } med armer som skilles med komma.

Bruk _ som standard, when til vaktbetingelser, og husk at armene testes ovenfra og ned. Sørg for at de er uttømmende, slik at unntak under kjøring unngås. Deretter utforskes type- og egenskapsmønstre.

Gratis å komme i gang

Lær deg C# med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
93
Leksjoner
346

Ofte stilte spørsmål

Er leksjonen «switch-uttrykk» gratis?

Ja – hele teksten i «switch-uttrykk» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av C# Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i C# Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «switch-uttrykk»?

Konsise switch-uttrykk som returnerer verdier. Du øver på C# Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med C# Academy?

Ingen tidligere erfaring er nødvendig. C# Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.

Hvor lang tid tar leksjonen «switch-uttrykk»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne C# Academy-leksjonen?

Ja. Alle C# Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. switch-uttrykk
  2. Type- og egenskapsmønstre
  3. Relasjonelle og logiske mønstre
  4. Liste- og tuppelmønstre
← Tilbake til C# Academy