Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Оператор объединения с null ?? возвращает значение левого операнда, если оно не равно null; в противном случае он вычисляет правый операнд и возвращает его значение. Оператор ?? не вычисляет правый операнд, если левый операнд равен ненулевому значению. Оператор присваивания null-объединения присваивает значение правого операнда левому операнду только в том случае, если левый операнд оценивается как 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
Левый операнд ??= оператора должен быть переменной, свойством или элементом индексатора .
Тип левого операнда операторов ?? и ??= не может быть значением типа, не допускающего значения null. В частности, можно использовать операторы объединения null с параметрами неограниченного типа:
private static void Display<T>(T a, T backup)
{
Console.WriteLine(a ?? backup);
}
Операторы объединения null являются правоассоциативными. То есть выражения формы
a ?? b ?? c
d ??= e ??= f
оцениваются как
a ?? (b ?? c)
d ??= (e ??= f)
Примеры
Операторы ?? и ??= могут быть полезны в следующих сценариях:
В выражениях с операторами
?., допускающих значение NULL, можно?[]использовать??оператор для предоставления альтернативного выражения для оценки в случае, если результат выражения с помощью условно-пустых операций:nulldouble SumNumbers(List<double[]> setsOfNumbers, int indexOfSetToSum) { return setsOfNumbers?[indexOfSetToSum]?.Sum() ?? double.NaN; } var sum = SumNumbers(null, 0); Console.WriteLine(sum); // output: NaNПри работе с типами значений, допускающим значение NULL , и необходимо предоставить значение базового типа значения, используйте
??оператор, чтобы указать значение, которое необходимо указать в случае, если значение типа null равноnull:int? a = null; int b = a ?? -1; Console.WriteLine(b); // output: -1Используйте метод, Nullable<T>.GetValueOrDefault() если значение, используемое при значении
nullтипа null, должно быть значением по умолчанию базового типа значения.Вы можете использовать выражение
throwв качестве правого операнда??оператора, чтобы сделать код проверки аргументов более кратким:public string Name { get => name; set => name = value ?? throw new ArgumentNullException(nameof(value), "Name cannot be null"); }В предыдущем примере также показано, как использовать элементы с выражением для определения свойства.
Вы можете использовать оператор
??=для замены кода формы.if (variable is null) { variable = expression; }со следующим кодом
variable ??= expression;
Перегрузка оператора
Операторы ?? и ??= не могут быть перегружены.
Спецификация языка C#
Дополнительные сведения об операторе ?? см. в разделе оператора объединения null в спецификации языка C#.
Дополнительные сведения об операторе ??= см. в разделе "Составное назначение " спецификации языка C#.