Как стать автором
Обновить

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

НЛО прилетело и опубликовало эту надпись здесь

Обмазываем всё приложение отключением валидации/бойлерплей кодом

Зачем обмазывать все - достаточно только public API.

А что не так с вашим "утрированием"? nullable позволяет выбросить наконец надоевшую валидацию по всему коду, бесконечные Guard.NotNull и прочие NRE на продуктиве.

Добавляется не пара процентов, а все 100% гарантии отсутствия null/NRE при условии, что вы этот nullable, конечно же, умеете готовить.

Я просто очень много видел людей, которые вставляют восклицательный знак то тут то там, а потом кричат, что nullable — фигня полная.

Практика "never null" хороша в попытке решить вышеуказанные проблемы (когда нет альтернативы в виде nullable context), но лишает возможности использовать null как инструмент в принципе, а это уже минус. Доп. минусом сюда идёт в комплекте то, что любой рандомный разраб всегда может случайно вернуть этот null куда не следует, и всё, считай, на смарку. Только потом еще есть шанс не найти этого места.

Используя оператор '!', мы "говорим" компилятору о том, что метод точно не вернёт null. Следовательно, предупреждений на данный участок кода не будет.

Следовало бы упомянуть, что использование ! для подавления предупреждения - плохая практика и так делать не стоит

Но иногда без этого никак. Пример: Activator.CreateObject(typeof(T)) возвращает null только в одном случае: если T - это Nullable<TValue>. Если мы в коде знаем, что это не наш случай, то нет проблемы подавить ошибку с помощью !.

Но надо чётко понимать, где использование правомерное, а где костыль.

object? GetPotentialNull(bool flag)
{
  return flag ? null : new object();
}

В примере кода из статьи второй знак вопроса после flag, это тернарный оператор или тоже nullable тип?

Тогда это ... ну очень своеобразный и совсем не очевидный синтаксис (и как хорошо, что мне на C# писать ничего не нужно).

Э-э-э, а что неочевидного-то в обычном тернарном операторе?

В самом тернарном операторе, как раз ничего, а вот одновременное использование ? в нескольких различных синтаксических конструкциях режет глаза. Особенно, когда они располагаются визуально очень близко.

Знак вопроса как разрешение nullable допустимо только с типами. Они не могут быть в тернарном операторе так, что их можно спутать

Что только не придумают, лишь бы Option не вводить...

В Entity Framework Core созданная модель будет непосредственно зависеть от того указан или нет nullable reference type при включении поддержки nullable reference.

Это избавляет от необходимости каждый раз задавать IsRequired свойство в каждом EntityType и очень удобно.

Таким образом это как минимум один случай, когда правильное использование данной функции влияет непосредственно на код

Зарегистрируйтесь на Хабре, чтобы оставить комментарий