C# 14 с .NET 10. Жду этот LTS как следующую базовую версию для всех проектов.
Главная фича которую ждал — field keyword для property accessors. Наконец можно писать проверку или вычисление в геттере/сеттере без явного объявления backing field. Классический паттерн с private string _name уходит в прошлое для типичных случаев.
Из остального что в поле зрения:
- Extension types — новый синтаксис
extensionблоков как альтернатива extension methods. Позволяет объявлять свойства и операторы для чужих типов, а не только методы. Пока присматриваюсь как лучше применять - Улучшения в работе с
Span<T>иparams— язык всё больше позволяет писать высокопроизводительный код без перехода на unsafe
Версия ещё в активной разработке пока пишу это, но основное направление уже понятно — язык взрослеет, убирает оставшийся бойлерплейт.
C# 13 с .NET 9. Релиз не LTS, нововведений в языке немного, но некоторые приятные.
params collections—paramsтеперь работает не только с массивом, но и сIEnumerable<T>,Span<T>и другими коллекциями. Наконец можно писать универсальные методы без перегрузок- новый тип
System.Threading.Lock— замена объекту-маркеру дляlock. Семантика та же, но явнее выражает намерение partialсвойства и индексаторы — расширяет паттерн partial для source generators, которые всё активнее используем\eescape-последовательность для ESC символа — мелочь для консольных утилит, но приятно.
В целом C# 13 чувствуется как шлифовка, а не крупный скачок — основные ожидания уже переключились на .NET 10.
Из того что прижилось сразу - это params collections и от части System.Threading.Lock, хотя пока не прочувствовал в чем сила в сравнении обычными объектами-пустышками.
C# 12 с .NET 8. Два нововведения сразу пошли в повседневную работу.
Primary constructors — долго ждали их для обычных классов (не только record). Зависимости через конструктор теперь объявляются прямо в заголовке класса, меньше бойлерплейта в сервисах. Правда нужно немного привыкнуть что параметр не становится полем автоматически — если нужно хранить, явно захватываем.
Collection expressions — [1, 2, 3], spread-оператор .. для объединения коллекций. Наконец синтаксис не хуже чем в других языках. Хорошо работает вместе с Span и ReadOnlySpan без дополнительных аллокаций.
Ещё из полезного:
usingалиасы теперь могут ссылаться на любые типы, не только named types —using Point = (int X, int Y)и т.п.- default параметры в lambda — стало удобнее передавать lambdas в места где нужна совместимость с несколькими сигнатурами
Релиз пушка-бомба!
C# 10 с .NET 6. Язык взял курс на лаконичность — каждый релиз убирает немного шума.
file-scoped namespace— убрал один уровень отступа во всех файлах. Мелочь, но глаз сразу радуетсяglobal using— вынес стандартные пространства имён в один файл, перестал видеть одинаковые блоки usings повсюдуrecord struct— всё что нравится в record, но value type. Пригодилось там где boxing нежелателенCallerArgumentExpression— для вспомогательных методов валидации выглядит хорошо, хотя применений пока немного- extended property patterns — можно писать
x is { Foo.Bar: not null }вместо вложенногоis { Foo: { Bar: ... } }
C# 9 вместе с .NET 5. Главное открытие — record. Наконец-то иммутабельный тип с value equality «из коробки», без ручной реализации Equals/GetHashCode. Сразу нашёл применение в доменных объектах и DTO.
Из других вещей что понравились:
init-only свойства — ещё один шаг к иммутабельности без лишней церемонииnew()— target-typed new, меньше повторений типов- pattern matching подрос:
is not, комбинацииand/orвswitch— стало реально выразительнее - top-level statements — оценил в небольших утилитах и скриптах
Nullable reference types технически появились в C# 8, но вот теперь по-настоящему начал включать nullable enable и разбираться с предупреждениями вместо того чтобы отключать.
В мою жизнь приходит async/await. Чтобы понять как это работает открываю для себя утилиты для просмотра IL-кода.
До этого момента работа с асинхронным исполнением была связана либо с BackgroundWorker (WinForms), либо готовыми методами API (типа BeginЧто-то, EndЧто-то) либо Таски с ContinueWith.
И многопоточка на .net в целом. До этого с многопоточностью имел дело лишь в универе когда писали программы для кластера суперкомпьютера.
Вместе со всем вышеперечисленным появляются задачи с использованием примитивов синхронизации, в основном lock (monitor) и ManualResetEvent
В университете на базе курса алгоритмов стал активно использовать дженерики по аналогии с шаблонными классами в плюсах.
Также получаю базовое представление о байт-коде, JIT компиляторе, CLR и Garbage Collector.
Разобрался с идеей языка. Начал уверовать в ООП. Открыл для себя делегаты и события.
Открыл для себя язык Си четыре плюса. Все говорят - очень круто, но мне не понятно и неудобно. Тем не менее требуется делать заказы и на нем, приходится разбираться.