Microsoft представила новые возможности, доступные в предварительной версии C# 15 — версии, которая выйдет вместе с .NET 11. Обновление включает объединённые типы, замкнутые иерархии и предварительную версию обновлённой модели работы с небезопасным кодом, а также небольшие изменения, направленные на сокращение повторяющегося процедурного кода в повседневном использовании.
Аргументы внутри коллекционных выражений
Коллекционные выражения в C# могут преобразовывать значения в различные типы коллекций, но ранее не позволяли передавать аргументы базовому конструктору или функции создания. C# 15 добавляет новый элемент в форме with(...), который помещается в начале выражения и позволяет передавать эти аргументы.
Например, это позволяет создать список с непосредственным указанием ёмкости внутри выражения или создать HashSet, передав StringComparer.OrdinalIgnoreCase, вместо разделения создания коллекции и добавления элементов. Microsoft отмечает, что эта возможность прокладывает путь к ожидаемому синтаксису выражений словарей, которому, вероятно, потребуется указывать средство сравнения, используемое для ключей.
Доступ к элементам через расширенные индексы
После того как C# 14 добавил расширенные члены для свойств и операторов наряду с методами, C# 15 расширяет эту модель, включив в неё расширенные индексы. Благодаря этому доступ к элементу объекта-приёмника становится возможен так, словно индекс изначально определён в его типе.
В примере Microsoft доступ к элементу IEnumerable<int> требовал вспомогательного метода, например ElementAtIndex. Новый синтаксис позволяет использовать numbers[2] через расширенный индекс, связанный с объектом-приёмником. В блоге поясняется, что индексы не могут быть статическими, поэтому содержащий расширение тип должен включать именованный объект-приёмник.
Метки для циклов break и continue
C# 15 позволяет помечать циклы, а затем напрямую направлять к ним break или continue. Это полезно во вложенных циклах, где для выхода из внешнего цикла обычно требовалась логическая переменная, использование goto или перенос логики в отдельную функцию.
На практике метка делает цель выхода очевидной внутри кода и устраняет необходимость в переменной для отслеживания того, найден ли нужный элемент. В примере показан цикл с меткой scan, из которого можно напрямую выйти с помощью break scan.
Что меняется для разработчиков?
Эти возможности не столько изменяют модель выполнения .NET, сколько реорганизуют синтаксис кода и сокращают некоторые повторяющиеся шаблоны. Их ценность особенно заметна в проектах, использующих коллекционные выражения, работающих с вложенными циклами или нуждающихся в более кратких интерфейсах доступа к расширяемым типам.
Однако возможности всё ещё находятся на стадии предварительной версии и поэтому пока не являются стабильным окончательным интерфейсом. Microsoft предлагает разработчикам скачать .NET 11 и попробовать C# 15 в своих приложениях, обратившись к полному справочнику по нововведениям и участвуя в текущих обсуждениях в рамках проекта csharplang. Источник в этом материале не указывает окончательную дату перевода возможностей в стабильный выпуск.