Freigeben über


?? und ??=: die NULL-Sammeloperatoren

Der Operator mit null-Koalescing ?? gibt den Wert des linken Operanden zurück, wenn er nicht nullist. 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 lautet null:

    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 ist null:

    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.

Siehe auch