Практическое назначение оператора присваивания с объединением нулей в C #?

#c# #.net #null

#c# #.net #null

Вопрос:

Нули в C#

Одна из новых функций C # позволяет нам избавиться от нулей в нашем коде с помощью ссылочных типов с нулевым значением. Нам рекомендуется добавить

 <Nullable>enable</Nullable>
  

в файл проекта из-за проблем, подобных описанным здесь .

Конечно, многие существующие проекты не хотят добавлять это. При включении этой функции необходимо устранить множество ошибок, поэтому многие устаревшие значения null все еще будут существовать. Но действительно ли нам нужны дополнительные нуль-функции в языке?

Путаница

В той же версии C # 8.0 был введен оператор присваивания с объединением нулей ( ??= ) (см. Документы). Я понимаю поведение, но какие проблемы оно решает для нас? Почему мы должны хотеть присваивать b x значение, когда оно равно null x ??= b , и иметь, например x = a , когда оно не равно null?

Примеры, которые я нашел, очень теоретические, может кто-нибудь дать мне реальное применение этого оператора? Заранее спасибо!

Ответ №1:

Примером реального мира может быть отложенная загрузка резервного поля при первом доступе, когда это резервное поле равно нулю. Что-то вроде этого:

 private string _dbQuery;
private string DbQuery => _dbQuery ??= GetQuery(queryName);
  

Ответ №2:

Простейший вариант использования заключается в том, что в зависимости от версии C # мы ранее сделали бы:

 if (number == null)
{
    number = someVale;
}
  

или

 number = number ?? someValue;
  

С помощью нового оператора присваивания мы можем сократить его до:

 number ??= someNumber;
  

Хотя пример из реального мира:

 public void WriteErrorToLog(string errorMessage, Exception ex)
{
    Log.Warn(errorMessage ??= AppConstants.UnhandledError, ex);
}
  

Не идеальный пример из реального мира. Но допустим, я хочу регистрировать ошибки soft. Написание шаблонного сообщения с исключением было бы гораздо предпочтительнее, чем генерирование второй ошибки / исключения.

Ответ №3:

Оператор с объединением нулей??возвращает значение его левого операнда, если оно не равно null; в противном случае он вычисляет правый операнд и возвращает его результат. Чем ??оператор не вычисляет свой правый операнд, если левый операнд оценивается как ненулевой.

Доступный в C # 8.0 и более поздних версиях, оператор присваивания с объединением нулей ??= присваивает значение своего правого операнда своему левому операнду только в том случае, если левый операнд принимает значение null. Оператор ??= не вычисляет свой правый операнд, если левый операнд оценивается как ненулевой.

 List<int> numbers = null;
int? a = null;

(numbers ??= new List<int>()).Add(5);
Console.WriteLine(string.Join(" ", numbers));  // output: 5

numbers.Add(a ??= 0);
Console.WriteLine(string.Join(" ", numbers));  // output: 5 0
Console.WriteLine(a);  // output: 0
  

Вы можете найти более подробную информацию здесь

Комментарии:

1. Проголосуйте за объяснение «??». Мне интересно узнать, какие аналогичные возможности доступны на других языках.