Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Operator ?? łączenia wartości null zwraca wartość operandu po lewej stronie, jeśli nie null. W przeciwnym razie oblicza operand po prawej stronie 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.
Dokumentacja języka C# zawiera ostatnio wydaną wersję języka C#. Zawiera również początkową dokumentację dla funkcjonalności w publicznych wersjach testowych nadchodzącego wydania języka.
Dokumentacja identyfikuje dowolną funkcję po raz pierwszy wprowadzoną w ostatnich trzech wersjach języka lub w bieżącej publicznej wersji zapoznawczej.
Wskazówka
Aby dowiedzieć się, kiedy funkcja została po raz pierwszy wprowadzona w języku C#, zapoznaj się z artykułem dotyczącym historii wersji języka C#.
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 ??= są przydatne w następujących scenariuszach:
W wyrażeniach używających operatorów
?.warunkowych null i?[], użyj??operatora , aby podać wyrażenie alternatywne, aby sprawdzić, czy 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: NaNGdy pracujesz z typami wartości dopuszczanych wartości null i musisz podać wartość bazowego typu wartości, użyj
??operatora , aby określić wartość, aby podać, jeśli wartość typu dopuszczalnego wartości null tonull:int? a = null; int b = a ?? -1; Console.WriteLine(b); // output: -1Nullable<T>.GetValueOrDefault() Użyj metody , jeśli wartość, która ma być używana, gdy wartość typu dopuszczalnego wartości null powinna
nullbyć wartością domyślną bazowego typu wartości.Aby kod sprawdzania argumentów był bardziej zwięzły, użyj
throwwyrażenia jako operandu??po prawej stronie operatora: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.
??=Użyj operatora , aby zastąpić kod następującego formularza:if (variable is null) { variable = expression; }Użyj następującego kodu:
variable ??= expression;
Przeciążenie operatora
Nie można przeciążyć ?? operatorów i ??= .
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 sekcję ??=Przypisanie złożone specyfikacji języka C#.