?? 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 ärnull
: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 ärnull
: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äretif (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.