>
>
>
Что нового в .NET 8?

Артём Ровенский
Статей: 23

Что нового в .NET 8?

.NET 8 вышел в релиз, значит можно начинать переносить свои проекты на новую версию. В этой статье мы рассмотрим новые улучшения и фишки: C# 12, производительность, Native AOT, GC, новые типы, направленные на повышение производительности, NuGet Audit и прочее.

C# 12

По нововведениям C# 12 мы уже прошлись в отдельной статье. В ней мы затронули новые особенности языка: первичные конструкторы, параметры по умолчанию, collection expressions, inline массивов и остальное. В этот раз изменений не очень много. А как вы оцениваете обновление языка? Мы вот взглянули, и сразу появились идеи для новых правил C# анализатора.

Кстати, раз уж речь зашла про анализатор, сделаю небольшой анонс. Мы уже работаем над поддержкой .NET 8 и C# 12 — она появится в PVS-Studio 7.28. Релиз запланирован на начало декабря, и чтобы его не пропустить, приглашаю подписаться на рассылку пресс-релизов.

Производительность

Microsoft сказали, что представленный в прошлом году .NET 7 очень быстрый, но .NET 8 быстрее. И это действительно так. Stephen Toub в присущей ему манере рассказал про улучшения производительности в .NET 8. Это статья на сотни страниц, охватывающая если не все, то большинство улучшений. Усовершенствования коснулись таких вещей, как JIT, GC, рефлексия, коллекции, LINQ, кодогенерация, сериализция и десериализция, примитивные типы и многое другое.

В статье очень большое внимание уделено сравнению производительности .NET 7 и .NET 8, много сравнительных таблиц. Заходите почитать, я думаю, что каждый найдёт там что-то интересное.

Native AOT

Вкратце напомню об этой технологии. Если коротко, то Native AOT использует ahead of time компилятор для компиляции IL в машинный код во время публикации self-contained приложения. В .NET 8 добавлена поддержка архитектур x64 и arm64 на macOS.

Native AOT приложения включают в себя .NET runtime. Исходя из этого, они имеют больший размер по сравнению с обычными приложениями. В .NET 8 улучшили и этот аспект. В таблице представлен размер для "Hello World" программы на .NET 7 и .NET 8:

Operating system

.NET 7

.NET 8

Linux x64 (with -p:StripSymbols=true)

3.76 MB

1.84 MB

Windows x64

2.85 MB

1.77 MB

Как видно из таблицы, размер приложения на Linux был заметно уменьшен – на целых 50%.

Также .NET 8 начинает работу по включению поддержки Native AOT для iOS подобных платформ. Стоит заметить, что это только начало работы, и разработчики просят не делать поспешных выводов о производительности. Теперь вы можете собирать и запускать .NET iOS и .NET MAUI приложения с Native AOT на следующих платформах: ios, iossimulator, maccatalyst, tvos и tvossimulator.

Новые типы, нацеленные на производительность

В .NET 8 были добавлены типы, нацеленные на производительность в различных сценариях. Теперь у разработчиков появились коллекции FrozenDictionary<TKey, TValue> и FrozenSet<T>, которые находятся в пространстве имён System.Collections.Frozen. Новые коллекции обеспечивают неизменяемость ключей или значений после создания. Это позволяет их специально оптимизировать для операций чтения. Довольно полезное нововведение для случаев, когда коллекция заполняется при первом использовании и хранится в течение длительного времени. Пример использования:

private static readonly FrozenDictionary<string, bool> _settings = 
  GetSettings().ToFrozenDictionary();
....
if (_settings.TryGetValue(key, out bool setting))
{
    //....
}

Добавлен новый тип SearchValues<T>. Он представляет неизменяемый набор элементов, доступный только для чтения, который оптимизирован для эффективного поиска.

Ещё один новый тип CompositeFormat появился специально для ситуаций, когда строки формата неизвестны на этапе компиляции. Например, если строка формата загружается из ресурсов.

Ну и напоследок появились новые типы XxHash3 и XxHash128, которые предоставляют реализацию быстрых алгоритмов хеширования XXH3 и XXH128.

NuGet Audit

Безопасность играет важную роль в разработке, и разработчики .NET не забывают про это. Теперь при выполнении dotnet add и dotnet restore вы будете получать предупреждения о каждом пакете, который содержит уязвимость.

Кстати говоря, PVS-Studio умеет искать уязвимые компоненты, которые используются в вашем проекте. Если используемая вами библиотека содержит в себе другую уязвимую библиотеку, анализатор также выдаст предупреждение. Таким образом, анализатор ищет не только прямые уязвимые зависимости, но и транзитивные. Подробнее про PVS-Studio как SCA-решение.

Random

Для работы со случайностью были добавлены новые методы:

Метод GetItems поможет случайно выбрать указанное количество элементов из переданного набора, а метод Shuffle перемешает переданную последовательность элементов.

Как пишут разработчики, подобные нововведения полезны в сфере машинного обучения.

Garbage collection

В .NET 8 была добавлена возможность регулирования ограничения памяти. Данная возможность может быть полезна для облачных сервисов. Например, при пониженной нагрузке можно уменьшить количество доступной памяти. Для регулирования лимитов нужно вызвать метод RefreshMemoryLimit.

Также теперь можно обновлять некоторые настройки конфигурации GC. Например, можно установить жёсткий предел для размера кучи:

AppContext.SetData("GCHeapHardLimit", _memoryLimit);
GC.RefreshMemoryLimit();

Улучшения System.Text.Json

Сериализацию и десериализацию сильно улучшили с выходом нового .NET. Улучшений очень много, так что я постараюсь выделить основные.

Итак, улучшения:

  • подтянули производительность;
  • уменьшили размер Native AOT приложений, которые используют System.Text.Json;
  • кодогенератор теперь поддерживает сериализацию для required и init членов. Это уже поддерживалось в сериализации на основе рефлекции;
  • поддержка иерархии интерфейсов;
  • расширена функциональность атрибута JsonSourceGenerationOptionsAttribute;
  • теперь вы можете отключить сериализацию на основе рефлексии, которая включена по умолчанию.

Узнать про все добавленные функции, исправления багов и прочее вы можете из соответствующей статьи: "What's new in System.Text.Json in .NET 8".

Заключение

Вспоминая новые фишки .NET 7, кажется, что в .NET 8 появилось не так уж и много чего.

Но могу заверить вас, что улучшений всё ещё много. Кажется, что разработчики в этот раз сконцентрировались скорее на точечных улучшениях платформы. Есть множество не таких больших, но всё ещё важных улучшений во многих областях использования .NET.

В статье перечислены только самые интересные нововведения, которые были бы полезны большинству разработчиков. Со всеми улучшениями вы можете ознакомиться здесь. Если вы нашли для себя что-то полезное и этого нет в статье, то пишите об этом комментариях.

Используете ли вы уже что-то из фишек нового .NET? Пишите в комментариях.