Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Operátor ?? null-coalescing vrátí hodnotu levého operandu, pokud není null; v opačném případě vyhodnotí pravý operand a vrátí jeho výsledek. Operátor ?? nevyhodnocuje svůj pravý operand, pokud se levý operand vyhodnotí jako nenulový. Operátor přiřazení s nulovým sloučením ??= přiřazuje hodnotu pravého operandu levému operandu pouze pokud levý operand má hodnotu null. Operátor ??= nevyhodnocuje svůj pravý operand, pokud se levý operand vyhodnotí jako nenulový.
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
Levý operand operátoru ??= musí být proměnná, vlastnost, nebo prvek indexeru.
Typ levého operandu ?? a ??= operátorů nemůže být nenulový typ hodnoty. Konkrétně můžete použít null-coalescing operátory s neomezenými parametry typu:
private static void Display<T>(T a, T backup)
{
Console.WriteLine(a ?? backup);
}
Operátory nulového slučování jsou pravé asociativní. To znamená výrazy ve formě.
a ?? b ?? c
d ??= e ??= f
se vyhodnocují 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 podmíněnými operátory
?.null a?[]pomocí operátoru??můžete poskytnout alternativní výraz k vyhodnocení v případě, že výsledkem výrazu s podmíněnými operacemi 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á se má poskytnout v případě, že hodnota typu null jenull:int? a = null; int b = a ?? -1; Console.WriteLine(b); // output: -1Použijte metodu Nullable<T>.GetValueOrDefault() , pokud hodnota, která se má použít, když je
nullhodnota typu null by měla být výchozí hodnotou základního typu hodnoty.Můžete použít
throwvýraz jako pravý operand operátoru??, aby byl kód pro kontrolu argumentů stručnější:public string Name { get => name; set => name = value ?? throw new ArgumentNullException(nameof(value), "Name cannot be null"); }Předchozí příklad také ukazuje, jak použít členy těl výrazu pro definici vlastnosti.
Pomocí operátoru
??=můžete nahradit kód formuláře.if (variable is null) { variable = expression; }s následujícím kódem:
variable ??= expression;
Přetížení operátoru
Operátory ?? a ??= nelze přetížit.
Specifikace jazyka C#
Další informace o operátoru ?? naleznete v části operátoru nulového sjednoceníspecifikace jazyka C#.
Další informace o operátoru ??= naleznete v části Složené přiřazení specifikace jazyka C#.