Zwei Fragezeichen in C#: Kein Fehler, sondern ein mächtiges Werkzeug
\n\nStellen Sie sich vor: Sie schreiben Code in C# und sehen plötzlich die Konstruktion ??. Der erste Gedanke – ein Tippfehler? Ein überflüssiges Zeichen? Tatsächlich ist dies einer der elegantesten und nützlichsten Operatoren der Sprache – der Null-Coalescing-Operator. Wenn Sie jemals eine NullReferenceException abgefangen und alles verflucht haben – dieser Operator wird Ihr Rettungsanker sein.
In diesem Artikel werden wir analysieren, was zwei Fragezeichen in C# bedeuten, wie man sie richtig verwendet, wie sie sich vom ternären Operator unterscheiden, und wir zeigen Ihnen praktische Beispiele aus der Praxis. Los geht's!
\n\nWas ist der ??-Operator in C#?
\n\nDer Operator ?? (zwei Fragezeichen) ist ein binärer Operator, der den linken Operanden zurückgibt, wenn dieser nicht null ist; andernfalls gibt er den rechten Operanden zurück. Einfach gesagt: „Wenn links nicht null ist – nimm links, sonst nimm rechts“.
Die Syntax ist denkbar einfach:
\n\nvar result = left ?? right;\n\nWobei:
\n- \n
left– der Wert, der null sein kann; \n right– der Standardwert (darf nicht null sein, wenn der rechte Typ nullable ist). \n
Erstes Beispiel: Rettung vor null
\n\nAngenommen, Sie haben eine Variable string? name (nullable string). Sie möchten den Benutzernamen ausgeben, und wenn es keinen gibt – „Gast“:
string? name = GetUserName(); // kann null zurückgeben\nstring displayName = name ?? "Gast";\nConsole.WriteLine(displayName);\n\nOhne den ??-Operator müssten Sie schreiben:
string displayName = (name != null) ? name : "Gast";\n\nGeben Sie zu, die erste Variante liest sich wie ein normaler Satz: „Name oder Gast“. Schön, oder?
\n\nDer ??=-Operator: Die nächste Generation des Null-Coalescing
\n\nSeit C# 8.0 gibt es den Operator ??= – eine Kurzform der Zuweisung mit Null-Coalescing. Er weist den Wert des rechten Operanden dem linken zu, jedoch nur, wenn der linke Operand null ist.
Syntax:
\n\nleft ??= right;\n\nDies ist äquivalent zu:
\n\nif (left == null) left = right;\n\nBeispiel mit ??=
\n\nList<int>? numbers = null;\nnumbers ??= new List<int>(); // numbers ist jetzt = new List<int>()\nnumbers.Add(42);\nConsole.WriteLine(numbers.Count); // 1\n\nBeachten Sie: Wenn numbers bereits initialisiert wäre (nicht null), würde keine Zuweisung erfolgen. Dies ist ideal für die verzögerte Initialisierung.
Vergleich mit dem ternären Operator (? :)
\n\nViele Anfänger verwechseln ?? mit dem ternären Operator ? :. Lassen Sie uns das ein für alle Mal klären:
- \n
- Ternärer Operator – eine Kurzform von if-else. Er prüft JEDE boolesche Bedingung:
bedingung ? wert_wenn_true : wert_wenn_false. \n - ??-Operator – prüft NUR auf null. Dies ist ein Spezialfall, der auf eine einzige Aufgabe zugeschnitten ist. \n
Beispiel für den ternären Operator:
\n\nint age = 18;\nstring status = (age >= 18) ? "Erwachsen" : "Minderjährig";\n\nUnd was passiert, wenn man versucht, ?? durch den ternären Operator zu ersetzen:
string? name = null;\nstring displayName = name != null ? name : "Gast"; // funktioniert, aber länger\nstring displayName2 = name ?? "Gast"; // kürzer und verständlicher\n\nFazit: Verwenden Sie ??, wenn Sie einfach einen Standardwert anstelle von null einsetzen müssen. Für alle anderen Bedingungen verwenden Sie den ternären Operator.
Verkettung von ??-Operatoren
\n\nSie können mehrere ??-Operatoren zu einer Kette verbinden. Dies ist praktisch, wenn es mehrere mögliche Quellen für einen Wert gibt:
string? firstChoice = GetFromCache