﻿# Что нового в \.NET 8?

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

![1080_Whats_New_In_NET8_ru/image1.png](https://import.viva64.com/docx/blog/1080_Whats_New_In_NET8_ru/image1.png)

## C\# 12

По нововведениям C\# 12 мы уже прошлись в отдельной [статье](https://pvs-studio.ru/ru/blog/posts/csharp/1074/)\. В ней мы затронули новые особенности языка: первичные конструкторы, параметры по умолчанию, collection expressions, inline массивов и остальное\. В этот раз изменений не очень много\. А как вы оцениваете обновление языка? Мы вот взглянули, и сразу появились идеи для новых правил C\# анализатора\.

Кстати, раз уж речь зашла про анализатор, сделаю небольшой анонс\. Мы уже работаем над поддержкой \.NET 8 и C\# 12 — она появится в PVS\-Studio 7\.28\. Релиз запланирован на начало декабря, и чтобы его не пропустить, приглашаю подписаться на [рассылку пресс\-релизов](https://pvs-studio.ru/ru/subscribe/)\.

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

Microsoft сказали, что представленный в прошлом году \.NET 7 очень быстрый, но \.NET 8 быстрее\. И это действительно так\. Stephen Toub в присущей ему манере рассказал про улучшения производительности в \.NET 8\. Это [статья](https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-8/) на сотни страниц, охватывающая если не все, то большинство улучшений\. Усовершенствования коснулись таких вещей, как JIT, GC, рефлексия, коллекции, LINQ, кодогенерация, сериализция и десериализция, примитивные типы и многое другое\.

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

## Native AOT

Вкратце напомню об этой технологии\. Если коротко, то Native AOT использует ahead of time компилятор для компиляции IL в машинный код во время публикации [self\-contained](https://learn.microsoft.com/en-us/dotnet/core/deploying/#publish-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_\. Новые коллекции обеспечивают неизменяемость ключей или значений после создания\. Это позволяет их специально оптимизировать для операций чтения\. Довольно полезное нововведение для случаев, когда коллекция заполняется при первом использовании и хранится в течение длительного времени\. Пример использования:

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

Добавлен новый тип [_SearchValues<T\>_](https://learn.microsoft.com/en-us/dotnet/api/system.buffers.searchvalues-1)\. Он представляет неизменяемый набор элементов, доступный только для чтения, который оптимизирован для эффективного поиска\.

Ещё один новый тип [_CompositeFormat_](https://learn.microsoft.com/en-us/dotnet/api/system.text.compositeformat) появился специально для ситуаций, когда строки формата неизвестны на этапе компиляции\. Например, если строка формата загружается из ресурсов\.

Ну и напоследок появились новые типы [_XxHash3_](https://learn.microsoft.com/en-us/dotnet/api/system.io.hashing.xxhash3) и [_XxHash128_](https://learn.microsoft.com/en-us/dotnet/api/system.io.hashing.xxhash128), которые предоставляют реализацию быстрых алгоритмов хеширования XXH3 и XXH128\.

## NuGet Audit

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

Кстати говоря, PVS\-Studio умеет искать уязвимые компоненты, которые используются в вашем проекте\. Если используемая вами библиотека содержит в себе другую уязвимую библиотеку, анализатор также выдаст предупреждение\. Таким образом, анализатор ищет не только прямые уязвимые зависимости, но и транзитивные\. [Подробнее про PVS\-Studio как SCA\-решение](https://pvs-studio.ru/ru/pvs-studio/sca/)\.

## Random

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

* [_Random\.GetItems_](https://learn.microsoft.com/en-us/dotnet/api/system.random)
* [_RandomNumberGenerator\.GetItems_](https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.randomnumbergenerator)
* [_Random\.Shuffle_](https://learn.microsoft.com/en-us/dotnet/api/system.random.shuffle)
* [_RandomNumberGenerator\.Shuffle_](https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.randomnumbergenerator.getitems)

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

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

## Garbage collection

В \.NET 8 была добавлена возможность регулирования ограничения памяти\. Данная возможность может быть полезна для облачных сервисов\. Например, при пониженной нагрузке можно уменьшить количество доступной памяти\. Для регулирования лимитов нужно вызвать метод [_RefreshMemoryLimit_](https://learn.microsoft.com/en-us/dotnet/api/system.gc.refreshmemorylimit#system-gc-refreshmemorylimit)\.

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

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

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

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

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

* подтянули производительность;
* уменьшили размер Native AOT приложений, которые используют _System\.Text\.Json_;
* кодогенератор теперь поддерживает сериализацию для _required_ и _init_ членов\. Это уже поддерживалось в сериализации на основе рефлекции;
* поддержка иерархии интерфейсов;
* расширена функциональность атрибута [JsonSourceGenerationOptionsAttribute](https://learn.microsoft.com/dotnet/api/system.text.json.serialization.jsonsourcegenerationoptionsattribute);
* теперь вы можете отключить сериализацию на основе рефлексии, которая включена по умолчанию\.

Узнать про все добавленные функции, исправления багов и прочее вы можете из соответствующей статьи: "[What's new in System\.Text\.Json in \.NET 8](https://devblogs.microsoft.com/dotnet/system-text-json-in-dotnet-8/)"\.

## Заключение

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

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

В статье перечислены только самые интересные нововведения, которые были бы полезны большинству разработчиков\. Со всеми улучшениями вы можете ознакомиться [здесь](https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-8)\. Если вы нашли для себя что\-то полезное и этого нет в статье, то пишите об этом комментариях\.

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