1. Ausdrücke vs Anweisungen
In C# gibt's zwei Kategorien: Anweisungen (Statement) und Ausdrücke (Expression). Über eine Anweisung sagt man meistens, dass sie ausgeführt wird, über einen Ausdruck – dass er ausgewertet wird. Aber das ist nicht das Wichtigste.
Das Hauptunterscheidungsmerkmal: Ein Ausdruck hat ein Ergebnis. Dieses Ergebnis hat einen Typ und kann einer Variable zugewiesen oder in einem anderen Ausdruck verwendet werden.
Beispiele:
| Code | Hinweise |
|---|---|
|
Anweisung |
|
Ausdruck, Typ bool |
|
Ausdruck, Typ entspricht dem Typ der Variable i |
|
Ausdruck, Typ entspricht dem Typ der Variable x |
Was bringt uns das?
Viele Anweisungen sind eigentlich Ausdrücke (sie liefern ein Ergebnis). Zum Beispiel funktioniert folgender Code:int x, y, z;
x = y = z = 1; // x = (y = (z = 1));
Du kannst das Ergebnis eines Ausdrucks ignorieren, wenn du es nicht brauchst:
Console.ReadLine(); // wir ignorieren das Eingabe-Ergebnis
Das ist praktisch, wenn der Ausdruck neben dem Ergebnis noch was Nützliches macht (zum Beispiel etwas ausgibt oder Eingaben liest).
2. Der ternäre Operator
In C# gibt's einen speziellen ternären (dreifachen) Operator. Er ist wie eine Kurzschreibweise für if–else:
Bedingung ? Ausdruck1 : Ausdruck2;
Wenn Bedingung wahr ist, wird Ausdruck1 ausgewertet, sonst Ausdruck2. Nach der Bedingung kommt ?, die beiden Ausdrücke werden mit : getrennt.
Der Hauptunterschied zu if-else: Der ternäre Operator ist ein Ausdruck, sein Ergebnis kannst du einer Variable zuweisen oder in anderen Ausdrücken verwenden.
Zum Beispiel: Minimum von zwei Zahlen berechnen:
int a = 2;
int b = 3;
int min = a < b ? a : b;
Oder einer Variable je nach Bedingung verschiedene Werte zuweisen:
int age = 25;
int money;
if (age > 30)
money = 100;
else
money = 50;
Das Gleiche mit dem ternären Operator:
int age = 25;
int money = age > 30 ? 100 : 50;
Was ist besser: if-else oder ternärer Operator? Von der Geschwindigkeit her gibt's keinen Unterschied, aber der ternäre Operator ist nice für kurze Bedingungen. Wenn der Code nicht in eine Zeile passt – lieber if-else für bessere Lesbarkeit nehmen.
3. Besonderheiten
Typen der Werte
Beide Zweige des ternären Operators (<wert_wenn_wahr> und <wert_wenn_falsch>) müssen vom gleichen Typ sein oder kompatibel (z.B. beide string oder beide int).
Funktioniert:
int a = 10, b = 20;
int max = (a > b) ? a : b; // beide Zweige – int
Compiler-Fehler:
int a = 10, b = 20;
// string und int sind nicht kompatibel
string result = (a > b) ? "mehr" : 0; // Compiler-Fehler
Richtige Variante:
int a = 10, b = 20;
string result = (a > b) ? "mehr" : "weniger oder gleich";
Beispiel: Arbeit mit Zahlen
int number = -5;
int abs = (number >= 0) ? number : -number;
Console.WriteLine(abs); // 5
4. Ternären Operator in die Anwendung einbauen
Lass uns eine kleine Dialog-Anwendung schreiben: Neben der Begrüßung sagt das Programm dem User, wie alt er nächstes Jahr sein wird und ob er dann volljährig ist.
Console.Write("Gib deinen Namen ein: ");
string name = Console.ReadLine();
Console.Write("Gib dein Alter ein: ");
string ageText = Console.ReadLine();
int age = int.Parse(ageText);
int nextYear = age + 1;
string status = (nextYear >= 18) ? "volljährig" : "minderjährig";
Console.WriteLine($"Hi, {name}! Nächstes Jahr bist du {nextYear}. Du wirst {status} sein.");
Details erklärt:
- Die Variable status wird mit dem ternären Operator berechnet: Wenn das Alter im nächsten Jahr mindestens 18 ist, ist der User volljährig (oder bleibt es).
- Den ternären Operator kannst du easy direkt in Strings einbauen (zum Beispiel mit String-Interpolation $"").
5. Verschachtelte ternäre Operatoren – Vorsicht!
Du kannst ternäre Operatoren ineinander verschachteln (in jedem Zweig kann noch ein ternärer stehen). Aber… das gibt meistens Kopfweh, vor allem für den, der den Code nach dir lesen muss (auch wenn du das selbst bist in 2 Tagen).
Beispiel: Kategorie nach Alter bestimmen
string category = (age < 7) ? "vorschulkind" :
(age < 18) ? "schüler" :
(age < 65) ? "erwachsener" : "rentner";
Entscheidungstabelle:
| Alter | Bedingung | Ergebnis |
|---|---|---|
| < 7 | age < 7 | vorschulkind |
| 7–17 | age < 18 | schüler |
| 18–64 | age < 65 | erwachsener |
| 65 und mehr | sonst | rentner |
So ein Code ist noch lesbar, aber wenn die Logik komplizierter wird – lieber if-else if-else nehmen.
6. Lifehack: ternärer Operator und Typ bool
Manchmal sieht man sowas:
bool adult = (age >= 18) ? true : false;
Aber das ist unnötig. Der Ausdruck (age >= 18) gibt schon bool zurück. Du kannst also einfach:
bool adult = (age >= 18);
GO TO FULL VERSION