Dela via


?? och ??= operatörer – de null-sammanslutande operatörerna

Operatorn ?? null-coalescing returnerar värdet för dess vänstra operand om den inte nullär . 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 .

C#-språkreferensen dokumenterar den senaste versionen av C#-språket. Den innehåller även inledande dokumentation för funktioner i offentliga förhandsversioner för den kommande språkversionen.

Dokumentationen identifierar alla funktioner som först introducerades i de tre senaste versionerna av språket eller i aktuella offentliga förhandsversioner.

Tips/Råd

Information om när en funktion först introducerades i C# finns i artikeln om språkversionshistoriken för C#.

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 ??= är användbara i följande scenarier:

  • I uttryck som använder null-villkorliga operatorer ?. och ?[]använder du operatorn ?? för att ange ett alternativt uttryck för att utvärdera om resultatet av uttrycket med null-villkorliga å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 nullbara 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
    

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

  • Om du vill göra argumentkontrollkoden mer koncis använder du ett throw uttryck som operatorns ?? högra operande:

    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.

  • Använd operatorn ??= för att ersätta koden i följande formulär:

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

    Använd följande kod:

    variable ??= expression;
    

Möjlighet till operatoröverbelastning

Du kan inte överbelasta operatorerna ?? och ??= .

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 ??= avsnittet Sammansatt tilldelning i C#-språkspecifikationen.

Se även