Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Оператор ?? объединения 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
Левый операнд ??= оператора должен быть переменной, свойством или элементом индексатора .
Справочные документы по языку C# описывают последнюю выпущенную версию языка C#. Она также содержит начальную документацию по функциям в общедоступных предварительных версиях для предстоящего языкового выпуска.
Документация определяет любую функцию, впервые представленную в последних трех версиях языка или в текущих общедоступных предварительных версиях.
Подсказка
Чтобы узнать, когда функция впервые появилась в C#, ознакомьтесь со статьей об истории версий языка C#.
Тип левого операнда операторов ?? и ??= не может быть значением типа, не допускающего значения 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, используйте?[]??оператор для предоставления альтернативного выражения, чтобы оценить результат выражения с помощью условно-условных операцийnullnull:double 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() если значение, используемое при значении типа
nullnull, должно быть значением по умолчанию базового типа значения.Чтобы сделать код проверки аргументов более кратким, используйте
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#.