Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Der Operator mit null-Koalescing ??
gibt den Wert des linken Operanden zurück, wenn er nicht null
ist. Andernfalls wertet er den rechten Operanden aus und gibt das Ergebnis zurück. Der Operator ??
wertet seinen rechten Operanden nicht aus, wenn der linke Operand mit ungleich NULL auswertet wird. Der NULL-Sammeloperator für die Zuweisung ??=
weist den Wert seines rechten Operanden dem linken Operanden nur zu, wenn der linke Operand zu null
ausgewertet wird. Der Operator ??=
wertet seinen rechten Operanden nicht aus, wenn der linke Operand mit ungleich NULL auswertet wird.
List<int>? numbers = null;
int? a = null;
Console.WriteLine((numbers is null)); // expected: true
// if numbers is null, initialize it. Then, add 5 to numbers
(numbers ??= new List<int>()).Add(5);
Console.WriteLine(string.Join(" ", numbers)); // output: 5
Console.WriteLine((numbers is null)); // expected: false
Console.WriteLine((a is null)); // expected: true
Console.WriteLine((a ?? 3)); // expected: 3 since a is still null
// if a is null then assign 0 to a and add a to the list
numbers.Add(a ??= 0);
Console.WriteLine((a is null)); // expected: false
Console.WriteLine(string.Join(" ", numbers)); // output: 5 0
Console.WriteLine(a); // output: 0
Der linke Operand des ??=
Operators muss eine Variable, eine Eigenschaft oder ein Indexerelement sein.
Der Typ des linken Operanden der Operatoren ??
und ??=
kann kein nicht-nullfähiger Werttyp sein. Das heißt, Sie können die NULL-Sammeloperatoren mit uneingeschränkten Typparametern verwenden:
private static void Display<T>(T a, T backup)
{
Console.WriteLine(a ?? backup);
}
Die NULL-Sammeloperatoren sind rechtsassoziativ. Das heißt, Ausdrücke wie
a ?? b ?? c
d ??= e ??= f
werden wie folgt ausgewertet
a ?? (b ?? c)
d ??= (e ??= f)
Beispiele
Die ??
Operatoren und ??=
Operatoren können in den folgenden Szenarien nützlich sein:
In Ausdrücken mit den nullbedingten Operatoren
?.
und?[]
können Sie den??
Operator verwenden, um einen alternativen Ausdruck bereitzustellen, der ausgewertet werden soll, falls das Ergebnis des Ausdrucks mit null-bedingten Vorgängen lautetnull
:double SumNumbers(List<double[]> setsOfNumbers, int indexOfSetToSum) { return setsOfNumbers?[indexOfSetToSum]?.Sum() ?? double.NaN; } var sum = SumNumbers(null, 0); Console.WriteLine(sum); // output: NaN
Wenn Sie mit Nullwertetypen arbeiten und einen Wert eines zugrunde liegenden Werttyps angeben müssen, verwenden Sie den
??
Operator, um den Wert anzugeben, der bereitgestellt werden soll, falls ein Nullwert vom Typ null istnull
:int? a = null; int b = a ?? -1; Console.WriteLine(b); // output: -1
Verwenden Sie die Nullable<T>.GetValueOrDefault()-Methode, wenn der Wert, der verwenden werden soll, falls der Wert des Nullable-Typs
null
lautet, der Standardwert des zugrunde liegenden Werttyps sein soll.Sie können einen
throw
Ausdruck als rechten Operanden des??
Operators verwenden, um den Argumentüberprüfungscode präziser zu gestalten:public string Name { get => name; set => name = value ?? throw new ArgumentNullException(nameof(value), "Name cannot be null"); }
Das oben stehende Beispiel veranschaulicht auch, wie Sie Ausdruckskörpermember verwenden, um eine Eigenschaft zu definieren.
Sie können den
??=
Operator verwenden, um den Code des Formulars zu ersetzen.if (variable is null) { variable = expression; }
durch den folgenden Code:
variable ??= expression;
Operatorüberladbarkeit
Die Operatoren ??
und ??=
können nicht überladen werden.
C#-Sprachspezifikation
Weitere Informationen zum ??
Operator finden Sie im Abschnitt über den Null-Zusammenführungsoperator der C#-Sprachspezifikation.
Weitere Informationen zum ??=
-Operator finden Sie unter Hinweis zum Featurevorschlag.