?? En?? = operators - de operatoren null-coalescing
De operator ??
null-coalescing retourneert de waarde van de linkeroperand als dat niet null
het is; anders wordt de rechteroperand geëvalueerd en wordt het resultaat ervan geretourneerd. De ??
operator evalueert de rechteroperand niet als de linkeroperand resulteert in niet-null. De toewijzingsoperator ??=
null-coalescing wijst de waarde van de rechteroperand alleen toe aan de linkeroperand als de linkeroperand resulteert null
in . De ??=
operator evalueert de rechteroperand niet als de linkeroperand resulteert in niet-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
De linkeroperand van de ??=
operator moet een variabele, een eigenschap of een indexeerelement zijn.
Het type van de linkeroperand van de ??
en ??=
operators kan geen niet-null-waardetype zijn. U kunt met name de operators voor null-coalescing gebruiken met niet-gekoppelde typeparameters:
private static void Display<T>(T a, T backup)
{
Console.WriteLine(a ?? backup);
}
De operatoren voor null-coalescing zijn juist associatief. Dat wil gezegd, expressies van het formulier
a ?? b ?? c
d ??= e ??= f
worden geëvalueerd als
a ?? (b ?? c)
d ??= (e ??= f)
Voorbeelden
De ??
en ??=
operators kunnen handig zijn in de volgende scenario's:
In expressies met de null-voorwaardelijke operatoren
?.
en?[]
kunt u de??
operator gebruiken om een alternatieve expressie te bieden voor het geval het resultaat van de expressie met null-voorwaardelijke bewerkingen isnull
: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 voor het geval een null-waarde isnull
: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 null-waarden de standaardwaarde van het onderliggende waardetype moet
null
zijn.U kunt een
throw
expressie gebruiken als de rechteroperand van de??
operator om de code voor argumentcontrole beknopter te maken:public string Name { get => name; set => name = value ?? throw new ArgumentNullException(nameof(value), "Name cannot be null"); }
In het voorgaande voorbeeld ziet u ook hoe u expressie-bodyied leden gebruikt om een eigenschap te definiëren.
U kunt de
??=
operator gebruiken om de code van het formulier te vervangenif (variable is null) { variable = expression; }
met de volgende code:
variable ??= expression;
Overbelasting van operatoren
De operators ??
en ??=
kunnen niet worden overbelast.
C#-taalspecificatie
Zie de ??
sectie Null coalescing operator van de C#-taalspecificatie voor meer informatie over de operator.
Zie de notitie van het functievoorstel voor meer informatie over de ??=
operator.