1. Einführung
Stell dir vor, du bist Barista in einem angesagten Café. Ein Gast kommt zu dir und nennt eines seiner fünf Lieblingsgetränke. Du startest keine philosophische Diskussion, sondern schaust schnell in die Karte und reagierst: „Cappuccino? Klar! Hier ist dein Cappuccino!“. Wenn du jede Option mit einem eigenen if prüfen würdest, sähe dein Code aus wie ein Stapel Tassen nach dem Mittagsansturm – unübersichtlich und nicht wirklich praktisch.
Der switch-Operator erlaubt es dir, den Wert einer Variable elegant zu prüfen und je nach Ergebnis verschiedene Aktionen auszuführen. Er funktioniert nur mit bestimmten Datentypen (dazu gleich mehr), aber für die meisten Menüs, einfache Kommandos oder Statusabfragen ist das das perfekte Tool.
2. Syntax des klassischen switch in C#
Hier ist das minimalistische Ablaufdiagramm:
switch (Ausdruck) {
case Wert1:
// aktionen
break;
case Wert2:
// aktionen
break;
...
default:
// standard-aktion
break;
}
Beispiel 1: klassisches Menü
Console.WriteLine("Wähle ein Getränk: 1 - Kaffee, 2 - Tee, 3 - Kakao");
string input = Console.ReadLine();
int choice = int.Parse(input);
switch (choice)
{
case 1:
Console.WriteLine("Du hast Kaffee gewählt. Gute Wahl!");
break;
case 2:
Console.WriteLine("Tee ist auch gut.");
break;
case 3:
Console.WriteLine("Kakao – für Gemütlichkeitsfans!");
break;
default:
Console.WriteLine("Dieses Getränk gibt es nicht auf der Karte.");
break;
}
- Der switch-Block prüft choice auf Gleichheit mit den Werten nach case.
- Nach jedem Fall muss break; stehen – sonst läuft die Ausführung direkt in den nächsten case weiter (mehr dazu gleich).
- Der default-Block ist wie else; er wird ausgeführt, wenn kein case passt.
Wie funktioniert switch intern? – Schritt für Schritt
- Zuerst wird der Ausdruck in den Klammern nach switch ausgewertet (im Beispiel die Variable choice).
- Das Programm vergleicht diesen Wert nacheinander mit jedem angegebenen Wert (case).
- Wenn es passt – werden die Anweisungen dieses Blocks ausgeführt. Dann kommt break und das Programm verlässt den switch-Block.
- Wenn kein case passt, wird der default-Block ausgeführt (falls vorhanden).
Visuelles Schema
| Wert der Variable | case 1 | case 2 | case 3 | default |
|---|---|---|---|---|
| 1 | + | |||
| 2 | + | |||
| 3 | + | |||
| anderes | + |
„+“ – dieser Block wird ausgeführt
3. Welche Typen unterstützt der klassische switch?
Im klassischen Syntax (also ohne "Pattern Matching" und neue Features, dazu später mehr!) unterstützt switch:
- Einfache Ganzzahltypen (int, byte, char, long, short, sbyte, ushort, uint, ulong)
- Strings (string)
- Enums (enum)
- Zeichen (char)
Beispiel 2: Umschalten nach Strings
Console.WriteLine("Wähle einen Befehl: start, stop, pause");
string command = Console.ReadLine();
switch (command)
{
case "start":
Console.WriteLine("Programm gestartet!");
break;
case "stop":
Console.WriteLine("Programm gestoppt.");
break;
case "pause":
Console.WriteLine("Programm pausiert.");
break;
default:
Console.WriteLine("Unbekannter Befehl.");
break;
}
4. Warum braucht man break und was passiert, wenn man es vergisst?
Der beliebteste Anfängerfehler – break; im case zu vergessen. Lass uns anschauen, was passiert, wenn du es weglässt.
Beispiel 3: Durchfallen in den nächsten Block (fall-through)
int day = 2;
switch (day)
{
case 1:
Console.WriteLine("Montag");
break;
case 2:
Console.WriteLine("Dienstag");
case 3:
Console.WriteLine("Mittwoch");
break;
default:
Console.WriteLine("Unbekannter Tag");
break;
}
Was passiert?
- Am Anfang day = 2.
- Zuerst wird ausgegeben: "Dienstag"
- Kein break – die Ausführung läuft direkt weiter zu case 3 und gibt aus: "Mittwoch"
- Dann kommt break; – Ende.
Auf dem Bildschirm siehst du:
Dienstag
Mittwoch
Das ist ein typischer Fehler!
- Wenn du NUR eine Aktion willst, setze break; in jedem case.
- Wenn (selten) mehrere Fälle die gleiche Logik haben sollen, kannst du sie „zusammenkleben“ (siehe unten).
5. Gruppierung von case-Werten
Manchmal sollen mehrere Werte gleich behandelt werden. Warum den gleichen Code kopieren?
Beispiel 4: Gleiche Reaktion auf mehrere cases
char grade = 'B';
switch (grade)
{
case 'A':
case 'B':
case 'C':
Console.WriteLine("Bestanden!");
break;
case 'D':
case 'E':
Console.WriteLine("Da ist noch Luft nach oben.");
break;
default:
Console.WriteLine("Ungültige Note.");
break;
}
Was passiert?
- Wenn grade 'A', 'B' oder 'C' ist, wird der erste Block ausgeführt: "Bestanden!".
- Wenn 'D' oder 'E' – der zweite Block.
- Sonst – default.
6. Was geht und was nicht im klassischen switch
Erlaubt:
- Literale (Konstanten) in case verwenden, z.B.: case 1:, case 'A':, case "stop":.
- Vergleiche mit enum (Aufzählungen).
- default kann weggelassen werden, ist aber meistens nützlich.
Nicht erlaubt:
- Variablen in case verwenden (nur Konstanten).
- Bereiche vergleichen (case >= 5:, case x > 10: – geht nicht!).
- double, float und andere Fließkommazahlen – nur int, string, char, enum.
- Mehrere Werte mit Komma in einem case (case 1, 2: geht nicht; schreib mehrere cases hintereinander).
7. Besonderheiten und typische Fehler
In echten Projekten wird switch oft für Menüs, Statusabfragen, Kommandos, Fehlercodes und tausend andere Aufgaben genutzt. Aber wie jedes Tool gibt es auch hier Feinheiten.
Typische Fehler:
- Vergessenes break (wie schon besprochen).
- Falscher Typ im switch-Ausdruck (z.B. Versuch, double zu verwenden).
- Groß-/Kleinschreibung bei Strings stimmt nicht (case "Start": passt nicht zu "start") – Strings werden case-sensitiv verglichen!
- Unbehandelter Wert (default vergessen, User gibt was Falsches ein).
Falle mit verschachtelten switches
Solchen Code findet man manchmal, aber meistens ist er schwer zu lesen. Wenn du dich dabei erwischst, einen switch im switch zu verschachteln, ist es vielleicht Zeit, deinen Code in eine eigene Methode auszulagern oder sogar OOP/enum/Array zu nutzen.
GO TO FULL VERSION