if, switch & Schleifen
Kontrollstrukturen in C#: if/else, der moderne switch-Ausdruck mit Pattern Matching und die verschiedenen Schleifen-Varianten.
Inhaltsverzeichnis
Kontrollstrukturen in C#
C# bietet die klassischen Kontrollstrukturen - aber auch moderne Varianten, die deutlich ausdruckstaerker sind als frueher.
if / else
int alter = 18;
if (alter >= 18)
{
Console.WriteLine("Volljaehrig");
}
else if (alter >= 16)
{
Console.WriteLine("Fast volljaehrig");
}
else
{
Console.WriteLine("Zu jung");
}
Bei einer Zeile sind die {} optional, aber empfohlen:
if (alter >= 18) Console.WriteLine("Volljaehrig");
Ternaerer Operator
Fuer kurze “wenn - dann - sonst”-Ausdruecke:
var text = alter >= 18 ? "volljaehrig" : "minderjaehrig";
Logische Operatoren
var hatTicket = true;
var alterOk = alter >= 16;
// UND
if (hatTicket && alterOk) { /* ... */ }
// ODER
if (hatTicket || alterOk) { /* ... */ }
// NICHT
if (!hatTicket) { /* ... */ }
// Pattern Matching (C# 9+)
if (alter is >= 18 and < 65) { /* Erwachsen */ }
if (name is "Anna" or "Bob") { /* ... */ }
Null-Checks mit is
string? name = null;
if (name is null) Console.WriteLine("Kein Name");
if (name is not null) Console.WriteLine($"Hallo {name}");
Klassisches switch
switch (tag)
{
case "Montag":
Console.WriteLine("Wochenstart");
break;
case "Dienstag":
case "Mittwoch":
case "Donnerstag":
Console.WriteLine("Mitte der Woche");
break;
case "Freitag":
Console.WriteLine("Bald Wochenende");
break;
default:
Console.WriteLine("Wochenende");
break;
}
Wichtig: Jeder case braucht ein break (oder return, throw). C# erlaubt - anders als C - kein unbemerktes “Fall-through”.
switch-Ausdruck (C# 8+)
Die modernere Variante - viel kompakter:
var beschreibung = tag switch
{
"Montag" => "Wochenstart",
"Dienstag" or "Mittwoch" or "Donnerstag" => "Mitte der Woche",
"Freitag" => "Bald Wochenende",
_ => "Wochenende"
};
Vorteile:
- Gibt einen Wert zurueck (ist ein Ausdruck)
- Compiler prueft Vollstaendigkeit
_ist der Default-Fall- Mit
orkannst du mehrere Werte gruppieren
Pattern Matching im switch
var text = punkte switch
{
>= 90 => "A",
>= 80 => "B",
>= 70 => "C",
< 0 => "Fehler",
_ => "Durchgefallen"
};
Oder mit Typen:
string beschreibung = wert switch
{
int i when i > 0 => $"positive Zahl {i}",
int i => $"Zahl {i}",
string s => $"Text: {s}",
null => "null",
_ => "unbekannt"
};
Das ist ausdrucksstaerker als jedes klassische switch.
while
int n = 10;
while (n > 0)
{
Console.WriteLine(n);
n--;
}
do-while
Fuehrt den Block mindestens einmal aus:
string? eingabe;
do
{
Console.Write("Gib 'quit' ein: ");
eingabe = Console.ReadLine();
} while (eingabe != "quit");
for
Die klassische Zaehlschleife:
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i); // 0, 1, 2, 3, 4
}
Du kannst auch rueckwaerts laufen:
for (int i = 10; i >= 1; i--)
{
Console.WriteLine(i);
}
foreach
Um ueber Sammlungen zu iterieren - der Standard im C#-Alltag:
var namen = new[] { "Max", "Anna", "Leo" };
foreach (var name in namen)
{
Console.WriteLine(name);
}
Funktioniert mit allem, was IEnumerable<T> implementiert - Arrays, Lists, Dictionaries, Strings, LINQ-Ergebnisse.
Mit Index brauchst du etwas Extra:
foreach (var (name, index) in namen.Select((n, i) => (n, i)))
{
Console.WriteLine($"{index}: {name}");
}
break und continue
Klassisch:
for (int i = 1; i <= 10; i++)
{
if (i % 2 == 0) continue; // gerade ueberspringen
if (i > 7) break; // abbrechen
Console.WriteLine(i); // 1, 3, 5, 7
}
return in Schleifen
return verlaesst nicht nur die Schleife, sondern die ganze Funktion:
bool Enthaelt(int[] liste, int wert)
{
foreach (var z in liste)
{
if (z == wert) return true;
}
return false;
}
goto gibt es auch…
…aber nutze es nicht. Wenn du wirklich mal aus einer verschachtelten Schleife musst, bevorzuge eine kleine Hilfsfunktion oder return.
Zusammenfassung
- Klassisches
if/else,for,while,do-while,foreach switch-Ausdruck mit Pattern Matching ist oft eleganter alsif-Kettenismit Patterns (is not null,is >= 18 and < 65) ist sehr lesbarforeachist das Alltags-Tool fuer Sammlungen- Kein Fall-through zwischen
case-Zweigen
Im naechsten Kapitel: Methoden - wiederverwendbare Logik-Bausteine.