C# 14 принес с собой множество обновлений, делающих код чище, безопаснее и выразительнее. После тестирования я выделил пять лучших нововведений, хотя одно из них вызывает у меня сомнения. Давайте разберём всё по порядку.
1. Null-условное присваивание
В предыдущих версиях, например C# 13, приходилось вручную проверять объект на null перед присвоением значений свойствам:
if (channel != null) channel.Subscribers = 1000;
Рабочий, но громоздкий вариант.
Теперь, в C# 14, можно использовать null-условное присваивание, что делает код гораздо лаконичнее:
channel?.Subscribers = 1000;
Эта запись безопасно выполнит присваивание только если channel не равен null. Чисто и просто.
2. Ключевое слово field для резервных полей
Ранее при работе со свойствами вы наверняка использовали приватные резервные поля:
private int _subscribers;
public int Subscribers
{
get => _subscribers;
set => _subscribers = value;
}В C# 14 появилось ключевое слово field, позволяющее избавиться от лишних переменных:
public int Subscribers
{
get => field;
set
{
if (value < 1000)
throw new Exception("Недостаточно подписчиков!");
field = value;
}
}Теперь код выглядит компактнее, а вы всё так же можете добавлять нужную логику в setter.
3. Пользовательские составные операторы
Эта функция действительно впечатляет. В C# 14 появились пользовательские составные операторы, с помощью которых можно переопределять такие операторы, как + или ++ для своих классов.
Пример
public static Channel operator +(Channel c)
{
c.Subscribers++;
c.Members++;
return c;
}Теперь достаточно просто написать:
channel++;
И оба свойства — Subscribers и Members — увеличатся автоматически. Просто и красиво.
4. Новый ключевой оператор extension
Методы-расширения давно стали неотъемлемой частью C#, но их синтаксис выглядел немного устаревшим. Раньше это выглядело так:
public static class ChannelExtensions
{
public static void PrintDetails(this Channel channel)
{
Console.WriteLine($"Subs: {channel.Subscribers}, Members: {channel.Members}");
}
}Теперь в C# 14 можно использовать новое ключевое слово extension напрямую при определении расширения:
public extension Channel
{
public void PrintDetails()
=> Console.WriteLine($"Subs: {Subscribers}, Members: {Members}");
}Работает так же, только выглядит современнее.
Правда, у меня к этой функции двоякое отношение: она добавляет гибкость, но может внести путаницу в синтаксис между версиями C#.
5. Улучшенный nameof для открытых обобщённых типов
Теперь оператор nameof поддерживает открытые обобщённые типы, чего раньше не было.
В C# 13 следующая запись не работала:
nameof(Channel<>);
А вот в C# 14 — работает и возвращает "Channel".
Изменение небольшое, но полезное при генерации кода, рефлексии и диагностике.
Итоги
C# 14 предлагает отличный набор улучшений и синтаксического сахара.
Null-условное присваивание и пользовательские составные операторы — безусловные фавориты, а ключевое слово field делает определение свойств современнее.
Новый синтаксис с extension всё ещё спорный, но в целом язык развивается в правильном направлении.

