Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Operator ??
łączenia wartości null zwraca wartość swojego lewego operandu, jeśli nie jest null
; w przeciwnym razie ocenia prawy operand i zwraca jego wynik. Operator ??
nie przetwarza operandu po prawej stronie, jeśli operand po lewej stronie zwróci wartość inną niż null. Operator przypisania z domyślnym zerem ??=
przypisuje wartość operandu prawego do operandu po lewej stronie tylko wtedy, gdy operand po lewej stronie jest równy null
. Operator ??=
nie przetwarza operandu po prawej stronie, jeśli operand po lewej stronie zwróci wartość inną niż 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
Lewy człon operatora ??=
musi być zmienną, właściwością lub elementem indeksatora.
Typ operandu po lewej stronie operatorów ??
i ??=
nie może być typem wartości niemającym wartości null. W szczególności można użyć operatorów współdziałania typu null z parametrami typu bez ograniczeń:
private static void Display<T>(T a, T backup)
{
Console.WriteLine(a ?? backup);
}
Operatory łączenia wartości null mają prawostronną asocjację. To znaczy, wyrażenia w formie
a ?? b ?? c
d ??= e ??= f
są oceniane jako
a ?? (b ?? c)
d ??= (e ??= f)
Przykłady
Operatory ??
i ??=
mogą być przydatne w następujących scenariuszach:
W wyrażeniach z operatorami null-warunkowymi
?.
i?[]
można użyć operatora??
, aby podać wyrażenie alternatywne do obliczenia w przypadku, gdy wynik wyrażenia z operacjami null-warunkowymi tonull
:double SumNumbers(List<double[]> setsOfNumbers, int indexOfSetToSum) { return setsOfNumbers?[indexOfSetToSum]?.Sum() ?? double.NaN; } var sum = SumNumbers(null, 0); Console.WriteLine(sum); // output: NaN
Gdy pracujesz z typami dopuszczającymi null i musisz podać wartość bazowego typu wartości, użyj
??
operatora, aby określić wartość do podania w przypadku, gdy wartość typu dopuszczającego null tonull
:int? a = null; int b = a ?? -1; Console.WriteLine(b); // output: -1
Użyj metody Nullable<T>.GetValueOrDefault(), jeśli wartość, która ma być używana, gdy wartość typu nullable wynosi
null
, powinna być wartością domyślną bazowego typu wartości.Możesz użyć
throw
wyrażenia jako operandu??
po prawej stronie operatora, aby kod sprawdzania argumentów był bardziej zwięzły:public string Name { get => name; set => name = value ?? throw new ArgumentNullException(nameof(value), "Name cannot be null"); }
W poprzednim przykładzie pokazano również, jak używać składowych wyrażeń do definiowania właściwości.
Możesz użyć
??=
operatora , aby zastąpić kod formularzaif (variable is null) { variable = expression; }
z następującym kodem:
variable ??= expression;
Przeciążenie operatora
Operatory ??
i ??=
nie mogą być przeciążane.
Specyfikacja języka C#
Aby uzyskać więcej informacji na temat operatora ??
, zobacz sekcję Operator łączenia wartości null w specyfikacji języka C#.
Aby uzyskać więcej informacji na temat ??=
operatora, zobacz notatkę dotyczącą propozycji funkcji.