Dela via


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

Den null-koalescerande operatorn ?? returnerar värdet för dess vänstra operand om det inte är null. 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 ett icke-nullvärde. Null-coalescing tilldelningsoperatorn ??= tilldelar endast värdet av sin högra operand till sin vänstra operand om den vänstra operandens värde är null. Operatorn ??= utvärderar inte sin högra operand om den vänstra operanden utvärderas till ett icke-nullvärde.

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. Du kan använda nollkoalesceringoperatorerna med ogränsade typparametrar i synnerhet.

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

Null-coalescing-operatorerna är högerassociativa. Det vill säga, uttryck av formen

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;
    

Möjlighet till operatoröverbelastning

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