Delen via


?? en ??= operators : de operators voor null-coalescing

De operator ?? null-coalescing retourneert de waarde van de linkeroperand als dat niet nullhet is. Anders wordt de rechteroperand geëvalueerd en wordt het resultaat ervan geretourneerd. De ??-operator evalueert de rechteroperand niet als de linkeroperand niet-null is. De null-coalescing toewijzingsoperator ??= wijst de waarde van zijn rechteroperand toe aan zijn linkeroperand alleen als de linkeroperand null is. De ??=-operator evalueert de rechteroperand niet als de linkeroperand niet-null is.

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

De linkeroperand van de ??= operator moet een variabele, een eigenschap of een indexeerelement zijn.

De C#-taalreferentiedocumenten beschrijven de meest recent uitgebrachte versie van de C#-taal. Het bevat ook de eerste documentatie voor functies in openbare previews voor de aanstaande taalrelease.

De documentatie identificeert alle functies die voor het eerst zijn geïntroduceerd in de laatste drie versies van de taal of in de huidige openbare previews.

Aanbeveling

Raadpleeg het artikel over de versiegeschiedenis van de C#-taal om te achterhalen wanneer een functie voor het eerst is geïntroduceerd in C#.

Het type van de linkeroperand van de ?? en ??= operators kan geen niet-null-waardetype zijn. U kunt vooral de null-coalescing operators gebruiken met onbeperkte typeparameters.

private static void Display<T>(T a, T backup)
{
    Console.WriteLine(a ?? backup);
}

De operatoren voor null-coalescing zijn juist associatief. Dat wil zeggen, uitdrukkingen van de vorm

a ?? b ?? c
d ??= e ??= f

worden geëvalueerd als

a ?? (b ?? c)
d ??= (e ??= f)

Voorbeelden

De ?? en ??= operators zijn handig in de volgende scenario's:

  • In expressies die gebruikmaken van de null-voorwaardelijke operatoren ?. en ?[]gebruikt u de ?? operator om een alternatieve expressie te bieden om te evalueren of het resultaat van de expressie met null-voorwaardelijke bewerkingen is null:

    double SumNumbers(List<double[]> setsOfNumbers, int indexOfSetToSum)
    {
        return setsOfNumbers?[indexOfSetToSum]?.Sum() ?? double.NaN;
    }
    
    var sum = SumNumbers(null, 0);
    Console.WriteLine(sum);  // output: NaN
    
  • Wanneer u met null-waardetypen werkt en een waarde van een onderliggend waardetype moet opgeven, gebruikt u de ?? operator om de waarde op te geven die moet worden opgegeven als een waarde voor null-waarden is null:

    int? a = null;
    int b = a ?? -1;
    Console.WriteLine(b);  // output: -1
    

    Gebruik de Nullable<T>.GetValueOrDefault() methode als de waarde die moet worden gebruikt wanneer een waarde voor een null-type de standaardwaarde van het onderliggende waardetype is null .

  • Als u de code voor argumentcontrole beknopter wilt maken, gebruikt u een throw expressie als de rechteroperand van de ?? operator:

    public string Name
    {
        get => name;
        set => name = value ?? throw new ArgumentNullException(nameof(value), "Name cannot be null");
    }
    

    In het voorgaande voorbeeld wordt ook gedemonstreerd hoe expression-bodied members gebruikt worden om een eigenschap te definiëren.

  • Gebruik de ??= operator om code van het volgende formulier te vervangen:

    if (variable is null)
    {
        variable = expression;
    }
    

    Gebruik de volgende code:

    variable ??= expression;
    

Overbelasting van operatoren

U kunt de ?? en ??= operators niet overbelasten.

C#-taalspecificatie

Zie de ?? sectie Null coalescing operator van de C#-taalspecificatie voor meer informatie over de operator.

Zie de sectie ??= van de C#-taalspecificatie voor meer informatie over de operator.

Zie ook