?? I?? = operatory — operatory łączenia wartości null
Operator ??
łączenia wartości null zwraca wartość operandu po lewej stronie, jeśli nie null
jest ; w przeciwnym razie oblicza operand prawy i zwraca jego wynik. ??
Operator nie ocenia operandu po prawej stronie, jeśli operand po lewej stronie zwróci wartość inną niż null. Operator ??=
przypisania łączenia wartości null przypisuje wartość operandu prawego do operandu po lewej stronie tylko wtedy, gdy operand po lewej stronie zwróci wartość null
. ??=
Operator nie ocenia 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 operand ??=
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 bez wartości null. W szczególności można użyć operatorów łączenia wartości null z parametrami typu bez ograniczeń:
private static void Display<T>(T a, T backup)
{
Console.WriteLine(a ?? backup);
}
Operatory łączenia wartości null są odpowiednie do asocjacji. Oznacza to, że wyrażenia formularza
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
?.
warunkowymi null i?[]
, można użyć??
operatora , aby podać wyrażenie alternatywne do obliczenia w przypadku, gdy wynik wyrażenia z operacjami warunkowymi o wartości null 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 wartości dopuszczanych wartości null i musisz podać wartość bazowego typu wartości, użyj
??
operatora , aby określić wartość do podania w przypadku, gdy wartość typu dopuszczalnego wartości null tonull
:int? a = null; int b = a ?? -1; Console.WriteLine(b); // output: -1
Nullable<T>.GetValueOrDefault() Użyj metody , jeśli wartość, która ma być używana, gdy wartość typu dopuszczalnego wartości null powinna
null
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 można ich przeciążyć.
specyfikacja języka C#
Aby uzyskać więcej informacji na temat operatora, zobacz sekcję ??
Operator łączenia wartości null specyfikacji języka C#.
Aby uzyskać więcej informacji na temat ??=
operatora, zobacz notatkę dotyczącą propozycji funkcji.