?? a?? = – operátory (Referenční dokumentace jazyka C#)
Operátor pro sjednocení hodnoty null ?? vrátí hodnotu jeho levého operandu, pokud není null . v opačném případě vyhodnotí operand na pravé straně a vrátí výsledek. ??Operátor nevyhodnotí svůj pravý operand, pokud je levý operand vyhodnocen jako jiný než null.
K dispozici v jazyce C# 8,0 a novějším operátor přiřazení s hodnotou null ??= přiřadí hodnotu jeho pravého operandu k levému operandu pouze v případě, že je operand na levé straně vyhodnocen null . ??=Operátor nevyhodnotí svůj pravý operand, pokud je levý operand vyhodnocen jako jiný než null.
List<int> numbers = null;
int? a = null;
(numbers ??= new List<int>()).Add(5);
Console.WriteLine(string.Join(" ", numbers)); // output: 5
numbers.Add(a ??= 0);
Console.WriteLine(string.Join(" ", numbers)); // output: 5 0
Console.WriteLine(a); // output: 0
Levý operand ??= operátoru musí být proměnná, vlastnostnebo element indexeru .
V C# 7,3 a starších verzích musí být typ levého operandu ?? operátoru buď odkazový typ , nebo typ hodnoty s možnou hodnotou null. Počínaje jazykem C# 8,0 je tento požadavek nahrazen následujícím: typ levého operandu ?? ??= operátorů a nemůže být typ hodnoty, která není null. Konkrétně počínaje jazykem C# 8,0 můžete použít operátory slučování null s neomezenými parametry typu:
private static void Display<T>(T a, T backup)
{
Console.WriteLine(a ?? backup);
}
Operátory slučování s hodnotou null jsou asociativní zprava. To znamená, že výrazy ve formuláři
a ?? b ?? c
d ??= e ??= f
se vyhodnotí jako
a ?? (b ?? c)
d ??= (e ??= f)
Příklady
??Operátory a ??= můžou být užitečné v následujících scénářích:
Ve výrazech s operátory podmíněné hodnoty null?. a? []můžete použít
??operátor k poskytnutí alternativního výrazu pro vyhodnocení pro případ, že výsledek výrazu s hodnotami s hodnotou null jenull:double SumNumbers(List<double[]> setsOfNumbers, int indexOfSetToSum) { return setsOfNumbers?[indexOfSetToSum]?.Sum() ?? double.NaN; } var sum = SumNumbers(null, 0); Console.WriteLine(sum); // output: NaNKdyž pracujete s typy hodnot s možnou hodnotou null a potřebujete zadat hodnotu základního typu hodnoty, použijte
??operátor k určení hodnoty, která má být zadána pro případ, že hodnota typu s možnou hodnotou null jenull:int? a = null; int b = a ?? -1; Console.WriteLine(b); // output: -1Použijte Nullable<T>.GetValueOrDefault() metodu, pokud hodnota, která se má použít, když má být hodnota typu s možnou hodnotou null
nullvýchozí hodnotou základního typu hodnoty.Počínaje jazykem C# 7,0 můžete použít
throwvýraz jako pravý operand??operátoru k zajištění přesnější kódu pro kontrolu argumentu:public string Name { get => name; set => name = value ?? throw new ArgumentNullException(nameof(value), "Name cannot be null"); }Předchozí příklad také ukazuje, jak pomocí členů Expression-těle definovat vlastnost.
Počínaje jazykem C# 8,0 můžete použít
??=operátor k nahrazení kódu formulářeif (variable is null) { variable = expression; }s následujícím kódem:
variable ??= expression;
Přetížení operátoru
Operátory ?? a ??= nemohou být přetíženy.
specifikace jazyka C#
Další informace o ?? operátoru naleznete v oddílu " slučovací operátor null " specifikace jazyka C#.
Další informace o ??= operátoru najdete v poznámkách k návrhu funkcí.