Wyrażenia switch
Zwięzłe wyrażenia switch zwracające wartości.
Wyrażenia switch to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 4 lekcji w sumie.
Czym jest wyrażenie switch?
Wyrażenie switch porównuje dane wejściowe z serią wzorców i zwraca wartość. W przeciwieństwie do klasycznej instrukcji switch jest ono wyrażeniem, więc tworzy wynik, który można przypisać lub zwrócić.
Po wartości umieszcza się słowo kluczowe switch, a ramiona zapisuje jako pattern => result. Dzięki temu logika rozgałęzień jest zwięzła i funkcyjna.
int code = 2;
string name = code switch
{
1 => "One",
2 => "Two",
_ => "Other"
};
System.Console.WriteLine(name);Instrukcja a wyrażenie
Starsza instrukcja switch używa etykiet case i break. Nowsze wyrażenie switch całkowicie pomija te słowa kluczowe.
Ramiona oddziela się przecinkami, całość kończy średnikiem, a każde ramię zwraca wartość zamiast wykonywać bloki z przejściem do kolejnego przypadku. Eliminuje to całą klasę błędów wynikających z pominięcia break.
// Statement style
switch (code) { case 1: result = "One"; break; }
// Expression style
result = code switch { 1 => "One", _ => "?" };Ramię odrzucenia
Podkreślnik _ to wzorzec odrzucenia. Dopasowuje wszystko i działa jak przypadek domyślny.
Wyrażenia switch muszą być wyczerpujące: jeśli w czasie działania nie dopasuje się żadne ramię, zostaje zgłoszony wyjątek SwitchExpressionException. Dodanie ramienia _ gwarantuje dopasowanie do każdego możliwego wejścia.
using System;
class Program {
static void Main() {
int n = 7;
string size = n switch {
< 5 => "small",
_ => "big"
};
Console.WriteLine(size);
}
}Wzorce stałych
Najprostsze ramię używa wzorca stałej: literału, z którym dane wejściowe są porównywane za pomocą równości.
Stałymi mogą być liczby, ciągi znaków, znaki, elementy typów wyliczeniowych lub nazwane stałe. Są one oceniane od góry do dołu, dlatego najpierw należy umieścić ramiona najbardziej szczegółowe lub najczęściej używane.
char grade = 'B';
string label = grade switch
{
'A' => "Excellent",
'B' => "Good",
'C' => "Fair",
_ => "Needs work"
};
System.Console.WriteLine(label);Zwracanie z metody
Wyrażenia switch świetnie sprawdzają się wewnątrz metod. Ponieważ cała konstrukcja jest wyrażeniem, można zwrócić ją bezpośrednio za pomocą return, często jako jednoliniową metodę z ciałem wyrażeniowym.
Dzięki temu logika mapowania pozostaje czytelna i scentralizowana, zamiast być rozproszona w szeregu instrukcji if/else if.
using System;
class Program {
static string Day(int d) => d switch {
0 => "Sun", 6 => "Sat", _ => "Weekday"
};
static void Main() => Console.WriteLine(Day(6));
}Używanie switch z typami wyliczeniowymi
Typy wyliczeniowe naturalnie współpracują z wyrażeniami switch. Każde ramię określa element typu wyliczeniowego, a kompilator może ostrzec o brakującym przypadku, jeśli pominięto ramię odrzucenia.
Mimo to warto zachować ramię _, aby przyszłe wartości typu wyliczeniowego nie powodowały awarii aplikacji w czasie działania.
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);
}
}Klauzule warunkowe z when
Klauzula when dodaje warunek logiczny do ramienia. Ramię dopasowuje się tylko wtedy, gdy zarówno wzorzec, jak i warunek są prawdziwe.
Pozwala to doprecyzować dopasowania za pomocą dowolnej logiki, której nie da się wyrazić samym wzorcem, na przykład łącząc sprawdzanie zakresu z innymi zmiennymi.
int temp = 30;
string weather = temp switch
{
int t when t < 0 => "Freezing",
int t when t < 20 => "Cool",
_ => "Warm"
};
System.Console.WriteLine(weather);Kolejność ma znaczenie
Ramiona są sprawdzane w kolejności występowania w kodzie. Wygrywa pierwsze pasujące ramię, dlatego bardziej szczegółowe wzorce muszą znajdować się przed szerszymi.
Jeśli ogólne ramię poprzedza szczegółowe, kompilator zgłasza późniejsze ramię jako nieosiągalne. Należy czytać ramiona od góry do dołu — od wąskich do szerokich.
int score = 95;
string tier = score switch
{
>= 90 => "Gold",
>= 70 => "Silver",
_ => "Bronze"
};
System.Console.WriteLine(tier);Kompletność i wyjątki
Jeśli nie pokryto wszystkich możliwych danych wejściowych i żadne ramię nie pasuje, środowisko uruchomieniowe zgłasza wyjątek System.Runtime.CompilerServices.SwitchExpressionException.
Kompilator generuje ostrzeżenie CS8509, gdy nie może dowieść kompletności. Należy traktować je poważnie: dodać ramię odrzucenia albo obsłużyć brakujące wartości, aby wyrażenie było kompletne.
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);
}
}
}Łączenie wielu danych wejściowych
Aby przełączać na podstawie więcej niż jednej wartości, należy opakować je w krotkę. Ramiona dopasowują wtedy wzorce krotek, porównując każdą pozycję.
Jest to idealne rozwiązanie w przypadku maszyn stanów lub tabel decyzyjnych, w których wynik zależy od pary czynników. Wzorce krotek omówimy szczegółowo w późniejszej lekcji.
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);Czytelne ciała wyrażeń
Wyrażenia switch dobrze łączą się z LINQ i składowymi z ciałem wyrażeniowym, tworząc zwięzłe potoki.
Ponieważ każde ramię zwraca wartość, można użyć wyrażenia switch bezpośrednio wewnątrz projekcji Select albo jako argumentu metody, unikając zmiennych tymczasowych.
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));
}
}Szybki test
Sprawdź swoją wiedzę na temat wyrażeń switch.
Podsumowanie
Wyrażenia switch zwracają wartość za pomocą konstrukcji input switch { pattern => result, ... } z ramionami oddzielonymi przecinkami.
Używaj _ jako przypadku domyślnego, when do definiowania warunków i pamiętaj, że ramiona są sprawdzane od góry do dołu. Dbaj o ich kompletność, aby uniknąć wyjątków w czasie działania. Następnie omówimy wzorce typów i właściwości.
Często zadawane pytania
Czy lekcja „Wyrażenia switch” jest bezpłatna?
Tak — pełny tekst „Wyrażenia switch” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Wyrażenia switch”?
Zwięzłe wyrażenia switch zwracające wartości. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C# Academy?
Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Wyrażenia switch”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?
Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.