Найти в Дзене
Цифровая Переплавка

Что нового в C# 14: условные присваивания с null-оператором

Осенью вместе с релизом .NET 10 выходит C# 14 — и среди его новинок особенно выделяется оператор null-conditional assignment. На первый взгляд — «косметическое» улучшение. Но, как показывает практика, именно такие мелкие штрихи меняют стиль программирования и избавляют нас от тонны if-ов, проверяющих null. Вместо привычной конструкции: if (config?.Settings is not null)
{
config.Settings.RetryPolicy = new ExponentialBackoffRetryPolicy();
} Теперь можно написать в одну строчку: config?.Settings?.RetryPolicy = new ExponentialBackoffRetryPolicy(); То же самое доступно и для индексаторов: customerData?["LastLogin"] = DateTime.UtcNow; Оператор поддерживает составные присваивания (+=, -=) и даже комбинации с ??=: customer?.Name ??= "Guest"; Если слева встретится null, присваивание просто не произойдёт, а правое выражение даже не будет вычислено — это защищает от побочных эффектов. Для меня эта фича — логичное продолжение эволюции C#: По сути, это ещё один шаг к тому, чтобы C# оставался «
Оглавление
Иллюстрация демонстрирует фрагмент C#-кода с использованием нового оператора null-условного присваивания, подчёркивая элегантность и удобство работы с потенциально пустыми объектами.
Иллюстрация демонстрирует фрагмент C#-кода с использованием нового оператора null-условного присваивания, подчёркивая элегантность и удобство работы с потенциально пустыми объектами.

Осенью вместе с релизом .NET 10 выходит C# 14 — и среди его новинок особенно выделяется оператор null-conditional assignment. На первый взгляд — «косметическое» улучшение. Но, как показывает практика, именно такие мелкие штрихи меняют стиль программирования и избавляют нас от тонны if-ов, проверяющих null.

🆕 Как это работает

Вместо привычной конструкции:

if (config?.Settings is not null)
{
config.Settings.RetryPolicy = new ExponentialBackoffRetryPolicy();
}

Теперь можно написать в одну строчку:

config?.Settings?.RetryPolicy = new ExponentialBackoffRetryPolicy();

То же самое доступно и для индексаторов:

customerData?["LastLogin"] = DateTime.UtcNow;

Оператор поддерживает составные присваивания (+=, -=) и даже комбинации с ??=:

customer?.Name ??= "Guest";

Если слева встретится null, присваивание просто не произойдёт, а правое выражение даже не будет вычислено — это защищает от побочных эффектов.

⚙️ Ограничения

  • ➕➖ Нет поддержки ++ и --: компиляторы решили, что такие операции дадут слишком много неоднозначных сценариев.
  • 🧩 Только в preview: чтобы использовать оператор уже сейчас, в проекте нужно включить <LangVersion>preview</LangVersion> в .csproj.
  • 🕵️ Проблемы отладки: в слишком «сжатых» выражениях вроде
    customer?.Orders?.FirstOrDefault()?.OrderNumber = GenerateNewOrderNumber();трудно понять, на каком шаге потерялось значение. В таких случаях лучше явно разнести проверки по строкам и добавить логи.

🔍 Зачем это нужно

Для меня эта фича — логичное продолжение эволюции C#:

  • 🧹 код становится чище, меньше «шумовых» проверок;
  • ⚡ повышается читаемость в простых кейсах;
  • 🔒 снижается риск NullReferenceException в местах, где он особенно досаждает.

По сути, это ещё один шаг к тому, чтобы C# оставался «языком на каждый день», где разработчик тратит время на логику, а не на защиту от банальных ошибок.

🤔 Моё мнение

Я вижу этот оператор как инструмент «для бытовых случаев». Если им злоупотреблять — код быстро превращается в трудно читаемый набор условных цепочек. Но в правильных местах (работа с конфигами, DTO, данными из БД или словарями) он избавляет от рутинной обвязки и реально ускоряет работу.

Скорее всего, со временем мы увидим и другие подобные «синтаксические улучшения» — маленькие кирпичики, которые не делают революции, но формируют ощущение современного языка.

🔗 Источник: Ivan Kahl — What's New in C# 14: Null-Conditional Assignments