?? Och?? = operatorer – operatorerna null-coalescing

Operatorn ?? null-coalescing returnerar värdet för dess vänstra operande om den inte nullär det. Annars utvärderas den högra operanden och dess resultat returneras. Operatorn ?? utvärderar inte sin högra operand om den vänstra operanden utvärderas till icke-null. Tilldelningsoperatorn ??= null-coalescing tilldelar endast värdet för dess högra operande till dess vänstra operande om den vänstra operanden utvärderas till null. Operatorn ??= utvärderar inte sin högra operand om den vänstra operanden utvärderas till icke-null.

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	        

Operatorns ??= vänstra operande måste vara en variabel, en egenskap eller ett indexerarelement .

Typen av den vänstra operanden för operatorerna ?? och ??= kan inte vara en värdetyp som inte kan nulleras. I synnerhet kan du använda operatorerna null-coalescing med parametrar av ej tränad typ:

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

Operatorerna null-coalescing är rätt-associativa. Det vill: formuläruttryck

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

utvärderas som

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

Exempel

Operatorerna ?? och ??= kan vara användbara i följande scenarier:

  • I uttryck med null-villkorsoperatorer ?. och?[] kan du använda operatorn ?? för att ange ett alternativt uttryck för att utvärdera om resultatet av uttrycket med null-villkorsstyrda åtgärder är null:

    double SumNumbers(List<double[]> setsOfNumbers, int indexOfSetToSum)
    {
        return setsOfNumbers?[indexOfSetToSum]?.Sum() ?? double.NaN;
    }
    
    var sum = SumNumbers(null, 0);
    Console.WriteLine(sum);  // output: NaN
    
  • När du arbetar med null-värdetyper och behöver ange ett värde av en underliggande värdetyp använder du operatorn ?? för att ange det värde som ska anges om ett värde av typen null är null:

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

    Nullable<T>.GetValueOrDefault() Använd metoden om det värde som ska användas när ett värde av typen null ska null vara standardvärdet för den underliggande värdetypen.

  • Du kan använda ett throw uttryck som operatorns högra operand ?? för att göra argumentkontrollkoden mer koncis:

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

    Föregående exempel visar också hur du använder uttrycksbaserade medlemmar för att definiera en egenskap.

  • Du kan använda operatorn ??= för att ersätta koden i formuläret

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

    med följande kod:

    variable ??= expression;
    

Överlagring av operator

Operatorerna ?? och ??= kan inte överbelastas.

Språkspecifikation för C#

Mer information om operatorn finns i ?? avsnittet null coalescing operator i språkspecifikationen C#.

Mer information om operatorn ??= finns i kommentaren om funktionsförslaget.

Se även