?? Opérateurs ??=, opérateurs de coalescence nulle
L’opérateur de fusion null ??
retourne la valeur de l’opérande de gauche si elle n’est pas null
; sinon, il évalue l’opérande de droite et retourne son résultat. L’opérateur ??
n’évalue pas son opérande droit si l’opérande gauche a la valeur non Null. L’opérateur de coalescence nulle ??=
assigne la valeur de son opérande droit à son opérande gauche uniquement si l’opérande gauche a la valeur null
. L’opérateur ??=
n’évalue pas son opérande droit si l’opérande gauche a la valeur non 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
L’opérande gauche de l’opérateur ??=
doit être une variable, une propriétéou un élément d’indexeur.
Le type de l’opérande gauche des opérateurs ??
et ??=
ne peut pas être un type valeur non-nullable. En particulier, vous pouvez utiliser les opérateurs de coalescence nulle avec des paramètres de type non contraints :
private static void Display<T>(T a, T backup)
{
Console.WriteLine(a ?? backup);
}
Les opérateurs de coalescence nulle sont associatifs de droite. Autrement dit, des expressions du formulaire
a ?? b ?? c
d ??= e ??= f
sont évalués en tant que
a ?? (b ?? c)
d ??= (e ??= f)
Exemples
Les opérateurs ??
et ??=
peuvent être utiles dans les scénarios suivants :
Dans les expressions avec les opérateurs conditionnels null
?.
et?[]
, vous pouvez utiliser l’opérateur??
pour fournir une autre expression à évaluer si le résultat de l’expression avec des opérations conditionnelles null estnull
:double SumNumbers(List<double[]> setsOfNumbers, int indexOfSetToSum) { return setsOfNumbers?[indexOfSetToSum]?.Sum() ?? double.NaN; } var sum = SumNumbers(null, 0); Console.WriteLine(sum); // output: NaN
Lorsque vous utilisez des types valeur nullables et que vous devez fournir une valeur d’un type valeur sous-jacent, utilisez l’opérateur
??
pour spécifier la valeur à fournir au cas où une valeur de type nullable estnull
:int? a = null; int b = a ?? -1; Console.WriteLine(b); // output: -1
Utilisez la méthode Nullable<T>.GetValueOrDefault() si la valeur à utiliser quand une valeur de type Nullable est
null
doit être la valeur par défaut du type valeur sous-jacent.Vous pouvez utiliser une expression
throw
comme opérande droit de l’opérateur??
pour rendre le code de vérification des arguments plus concis :public string Name { get => name; set => name = value ?? throw new ArgumentNullException(nameof(value), "Name cannot be null"); }
L’exemple précédent montre également comment utiliser des membres expression-bodied pour définir une propriété.
Vous pouvez utiliser l’opérateur
??=
pour remplacer le code du formulaireif (variable is null) { variable = expression; }
par le code suivant :
variable ??= expression;
Capacité de surcharge de l’opérateur
Les opérateurs ??
et ??=
ne peuvent pas être surchargés.
spécification du langage C#
Pour plus d’informations sur l’opérateur ??
, consultez la section Opérateur de coalescence nulle de la spécification du langage C#.
Pour plus d’informations sur l’opérateur ??=
, consultez la note de proposition de fonctionnalité.
Voir aussi
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour