Новые возможности .NET 6

В .NET 6 доступны заключительные части плана унификации .NET, который был представлен в .NET 5. .NET 6 объединяет пакет SDK, базовые библиотеки и среду выполнения для мобильных, классических, облачных приложений и приложений Интернета вещей. Помимо этого экосистема .NET 6 предлагает следующие возможности:

  • Упрощенная разработка: приступить к работе очень просто. Новые возможности языка в C# 10 позволяют сократить объем создаваемого кода. А инвестиции в веб-решения и минимальные API позволяют быстро создавать небольшие и быстродействующие микрослужбы.

  • Более высокая производительность: .NET 6 — это самая быстрая веб-платформа комплексной разработки, которая снижает затраты на вычислительные ресурсы при работе в облаке.

  • Максимальная продуктивность: NET 6 и Visual Studio 2022 предоставляют возможности горячей перезагрузки, предлагают новые средства Git, инструменты интеллектуального редактирования кода, надежные средства диагностики, тестирования и более эффективной совместной работы групп.

.NET 6 будет поддерживаться в течение трех лет в качестве выпуска с долгосрочной поддержкой (LTS).

Предварительные версии функций по умолчанию отключены. Они также не поддерживаются для использования в рабочей среде и могут быть удалены в следующей версии. Новый RequiresPreviewFeaturesAttribute используется для добавления заметок к предварительным версиям API, а соответствующий анализатор выводит предупреждения, если вы используете эти API.

.NET 6 поддерживается средами Visual Studio 2022 и Visual Studio 2022 для Mac (и более поздних версий).

В этой статье рассматривается лишь часть новых возможностей .NET 6. Чтобы узнать обо всех новых функциях, а также получить дополнительные сведения о возможностях, приведенных в этой статье, ознакомьтесь с записью блога о выходе .NET 6.

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

.NET 6 содержит множество улучшений производительности. В этом разделе перечислены некоторые улучшения в FileStream, оптимизации с помощью профилей и компиляции AOT. Подробные сведения см. в записи блога об улучшениях производительности в .NET 6.

FileStream

Тип System.IO.FileStream был переработан для .NET 6, чтобы обеспечивать лучшую производительность и надежность в ОС Windows. Теперь FileStream никогда не блокируется при создании асинхронного ввода-вывода в Windows. Дополнительные сведения см. в записи блога об улучшениях файлового ввода-вывода в .NET 6.

Профильная оптимизация

Смысл профильной оптимизаций (PGO) заключается в том, что JIT-компилятор создает оптимизированный код с учетом самых часто используемых типов и путей кода. В .NET 6 появилась динамическая профильная оптимизация. Она работает в тесной связке с многоуровневой компиляцией для дальнейшей оптимизации кода на основе дополнительного инструментария, размещаемого на уровне 0. По умолчанию динамическая PGO отключена, но ее можно включить с помощью переменнойDOTNET_TieredPGO среды. Дополнительные сведения см. в статье об улучшениях производительности JIT-компиляции.

Crossgen2

В .NET 6 представлено средство Crossgen2, последователь удаленного Crossgen. Crossgen и Crossgen2 обеспечивают предварительную компиляцию (AOT) для сокращения времени запуска приложения. Средство Crossgen2 написано на C#, а не C++, и может выполнять операции анализа и оптимизации, которые были недоступны в предыдущей версии. Дополнительные сведения см. в статье о Crossgen2.

Поддержка Arm64

В выпуске .NET 6 представлена поддержка macOS Arm64 (или "Apple Silicon") и Windows Arm64 как для работы в собственном режиме Arm64 , так и в режиме эмуляции x64. Кроме того, установщики .NET x64 и Arm64 теперь устанавливаются параллельно. Дополнительные сведения см. в статье о поддержке .NET для macOS 11 и Windows 11 для Arm64 и x64.

Горячая перезагрузка

Горячая перезагрузка — это функция, которая позволяет изменять исходный код приложения и мгновенно применять внесенные изменения к работающему приложению. Ее цель — повысить продуктивность разработчиков, исключив перезапуски приложения между редактированиями. Горячая перезагрузка доступна в Visual Studio 2022 и программе командной строки dotnet watch. Горячая перезагрузка работает с большинством типов приложений NET, а также с исходным кодом на C#, Visual Basic и C++. Дополнительные сведения см. в записи блога о горячей перезагрузке.

.NET MAUI

.NET Multi-Platform App UI (.NET MAUI) все еще находится на этапе предварительной версии, релиз-кандидат выходит в первом квартале 2022 г., а общедоступная версия — во втором квартале 2022 г. .NET MAUI позволяет создавать собственные клиентские приложения для классических и мобильных операционных систем с одной базой кода. Дополнительные сведения см. в записи блога об обновлении .NET Multi-Platform App UI.

C# 10 и шаблоны

В C# 10 включены такие нововведения, как global usingдирективы, объявления пространств имен с областью действия файла и структуры записей. Дополнительные сведения см. в статье Новые возможности в C# 10.

В соответствии с этой работой, шаблоны проектов в пакете SDK для .NET для C# были модернизированы для использования некоторых новых возможностей языка.

  • Метод async Main
  • Инструкции верхнего уровня
  • Новые выражения целевого типа
  • Неявные директивы global using
  • Пространства имен с областью действия файла
  • Ссылочные типы, допускающие значение null

Если эти новые возможности языка добавляются в шаблоны проектов, новый код запускается с включенными возможностями. Однако при обновлении до .NET 6 существующий код не затрагивается. Дополнительные сведения об этих изменениях шаблонов см. в записи блога о модернизации шаблонов проектов C# в пакете SDK для .NET.

F# и Visual Basic

В F# 6 добавлено несколько улучшений языка F # и F# Interactive. Дополнительные сведения см. в статье Новые возможности в F# 6.

В Visual Basic улучшены возможности работы с Visual Studio и запуска проекта Windows Forms.

Рабочие нагрузки для пакета SDK

Чтобы уменьшить размер пакета SDK для .NET, некоторые компоненты были помещены в новые, необязательные рабочие нагрузки для пакета SDK. К этим компонентам относятся .NET MAUI и Blazor WebAssembly AO. Если вы используете Visual Studio, среда установит все необходимые рабочие нагрузки для пакета SDK. При использовании .NET CLIможно управлять рабочими нагрузками с помощью новых команд dotnet workload.

Команда Описание
dotnet workload search Выполняет поиск доступных рабочих нагрузок.
dotnet workload install Устанавливает указанную рабочую нагрузку.
dotnet workload uninstall Удаляет указанную рабочую нагрузку.
dotnet workload update Обновляет установленные рабочие нагрузки.
dotnet workload repair Переустанавливает все установленные рабочие нагрузки для восстановления поврежденной установки.
dotnet workload list Выводит список установленных рабочих нагрузок.

Дополнительные сведения см. в статье Дополнительные рабочие нагрузки для пакета SDK.

API-интерфейсы System.Text.Json

В System.Text.Json в .NET 6 внесено множество улучшений, так что теперь это решение сериализации промышленного класса.

Генератор исходного кода

В .NET 6 добавлен новый генератор исходного кода для System.Text.Json. Генератор исходного кода работает с JsonSerializer и может быть настроено несколькими способами. Он может повысить производительность, сократить использование памяти и упростить усечение сборок. Дополнительные сведения см. в статьях о выборе отражения или создания исходного кода в System.Text.Json и о создании исходного кода в System.Text.Json.

Записываемая модель DOM

Добавлена новая записываемая модель DOM, которая дополняет уже существующую модель DOM только для чтения. Новый API предоставляет упрощенную альтернативу сериализации для случаев, когда использовать простые старые типов POCO невозможно. Он также позволяет эффективно переходить к подразделу большого дерева JSON и считывать из него массив или десериализовывать POCO. Для поддержки записываемой модели DOM были добавлены следующие новые типы:

Дополнительные сведения см. в статье о видах DOM JSON.

Сериализация IAsyncEnumerable

System.Text.Json теперь поддерживает сериализацию и десериализацию с использованием экземпляров IAsyncEnumerable<T>. Асинхронные методы сериализации перечисляют все экземпляры IAsyncEnumerable<T> в графе объектов, а затем сериализуют их как массивы JSON. Для десериализации был добавлен новый метод JsonSerializer.DeserializeAsyncEnumerable<TValue>(Stream, JsonSerializerOptions, CancellationToken). Дополнительные сведения см. в статье Сериализация IAsyncEnumerable.

Другие новые API-интерфейсы

Новые интерфейсы сериализации для проверки и значения по умолчанию:

Дополнительные сведения см. в статье Обратные вызовы.

Новый атрибут сортировки свойств:

Новый метод для написания "необработанного" JSON:

Синхронная сериализация и десериализация в поток:

Новый параметр для пропуска объекта при обнаружении цикла ссылок во время сериализации:

Дополнительные сведения о сериализации и десериализации с помощью System.Text.Json см. в статье Сериализация и десериализация JSON в .NET.

HTTP/3

В .NET 6 включена поддержка предварительной версии HTTP/3 — новой версии HTTP. HTTP/3 решает некоторые существующие проблемы с функциональностью и производительностью, используя новый базовый протокол подключения QUIC. QUIC быстрее устанавливает подключения быстрее, а подключения не зависят от IP-адреса, что позволяет мобильным клиентам перемещаться между сетями Wi-Fi и сетями сотовой связи. Дополнительные сведения см. в статье Использование HTTP/3 с HttpClient.

ASP.NET Core

ASP.NET Core содержит усовершенствования для минимальных API-интерфейсов, предварительной компиляции (AOT) для приложений Blazor WebAssembly и одностраничных приложений. Кроме того, компоненты Blazor теперь можно визуализировать из JavaScript и интегрировать с существующими приложениями на основе JavaScript. Дополнительные сведения см. в статье Новые возможности в ASP.NET Core 6.

OpenTelemetry

.NET 6 предоставляет улучшенную поддержку OpenTelemetry, которая представляет собой набор средств, API и пакетов SDK, помогающих анализировать производительность и поведение программного обеспечения. API-интерфейсы в пространстве имен System.Diagnostics.Metrics реализуют спецификацию API метрик OpenTelemetry. Например, существует четыре класса инструментирования для поддержки различных сценариев использования метрик. Классы инструментирования:

Безопасность

В .NET 6 добавлена предварительная версия поддержки двух ключевых мер защиты: Control-flow Enforcement Technology (CET) и политика защиты памяти "write exclusive execute" (W^X).

CET — это технология Intel, доступная в некоторых современных процессорах Intel и AMD. Она добавляет в оборудование возможности, которые защищают от некоторых атак с перехватом потока управления. .NET 6 обеспечивает поддержку CET для приложений Windows x64, которую необходимо включить явным образом. Дополнительные сведения см. в статье Совместимость .NET 6 с теневыми стеками CET Intel.

Защита W^X доступна для всех операционных систем с .NET 6, но по умолчанию включена только в Apple Silicon. W^X блокирует простейшее направление атаки, запрещая одновременную запись и выполнение страниц памяти.

Обрезка IL

Улучшена обрезка автономных развертываний. В .NET 5 обрезались только неиспользуемые сборки. В .NET 6 также добавлена обрезка неиспользуемых типов и членов. Кроме того, предупреждения об обрезке, сообщающие о местах, где функция обрезки может удалить код, используемый во время выполнения, теперь включены по умолчанию. Дополнительные сведения см. в статье Обрезка автономных развертываний и исполняемых файлов.

Анализ кода

Пакет SDK для .NET 6 включает несколько новых анализаторов кода, имеющих отношение к совместимости API, совместимости платформы, безопасности обрезки, использования диапазона при сцеплении и разделении строк, ускоренных строковых API и ускоренных API сбора. Полный список новых (и удаленных) анализаторов см. в статье Выпуски анализаторов — .NET 6.

Пользовательские средства защиты платформы

Анализатор совместимости платформ распознает методы Is<Platform> в классе OperatingSystem, например OperatingSystem.IsWindows(), как средства защиты платформы. Для использования пользовательских средств защиты платформы в .NET 6 появились два новых атрибута, которые можно использовать для добавления заметок к полям, свойствам или методам с поддерживаемым или неподдерживаемым именем платформы:

Windows Forms

Application.SetDefaultFont(Font) — это новый метод в .NET 6, который задает шрифт по умолчанию для приложения.

Шаблоны для приложений Windows Forms на C# были обновлены для поддержки директив, пространств имен с областью действия файла и ссылочных типов, допускающих значение NULL, в global using. Кроме того, они включают в себя код начальной загрузки приложения, который сокращает стандартный код и позволяет конструктору Windows Forms отображать область конструктора в предпочтительном шрифте. Код начальной загрузки — это вызов ApplicationConfiguration.Initialize(), который является исходным созданным методом, осуществляющим вызовы к другим методам конфигурации, таким как Application.EnableVisualStyles(). Кроме того, если задать шрифт, отличный от используемого по умолчанию, с помощью свойства MSBuild ApplicationDefaultFont, ApplicationConfiguration.Initialize() осуществляет вызов SetDefaultFont(Font).

Дополнительные сведения см. в записи блога Новые возможности в Windows Forms.

Исходный код

Архив Tarball исходного кода, содержащий весь исходный код для пакета SDK для .NET, теперь является продуктом сборки пакета SDK для .NET. Используя этот архив Tarball исходного кода, другие организации, например Red Hat, могут создать собственную версию пакета SDK.

Моникеры целевой платформы

Были добавлены дополнительные моникеры целевой платформы, соответствующие конкретной операционной системе (TFM), например net6.0-android, net6.0-ios и net6.0-macos. Дополнительные сведения см. в статье TFM для конкретной ОС в .NET 5 и более поздних версиях.

Арифметические операторы в универсальных типах

В предварительной версии .NET 6 можно использовать операторы в универсальных типах. В .NET 6 представлено множество интерфейсов, в которых используется новая предварительная версия функции C# 10 — члены интерфейса static abstract. Эти интерфейсы соответствуют разным операторам. Например, IAdditionOperators представляет оператор +. Интерфейсы доступны в пакете NuGet System.Runtime.Experimental. Дополнительные сведения см. в записи блога о Generic math.

Проверка пакета NuGet

Если вы занимаетесь разработкой библиотеки NuGet, новое средство проверки пакетов позволяет проверять целостность пакетов и правильность их форматов. Можно определить следующие моменты:

  • наличие критических изменений в версиях пакета;
  • Пакет имеет одинаковый набор общедоступных API для всех реализаций, относящихся к среде выполнения.
  • наличие проблем в отношении применимости целевой платформы или среды выполнения.

Дополнительные сведения см. в записи блога Проверка пакета.

API-интерфейсы отражения

В .NET 6 появились следующие новые API-интерфейсы, которые проверяют код и предоставляют сведения о допустимости значений NULL:

Эти API-интерфейсы полезны при использовании для средств на основе отражения и сериализаторов.

API-интерфейсы Microsoft.Extensions

В .NET 6 внесены улучшения в ряд пространств имен расширений, как показано в таблице ниже.

Пространство имен Улучшения
Microsoft.Extensions.DependencyInjection CreateAsyncScope позволяет безопасно использовать оператор using для поставщика услуг, который регистрирует службу IAsyncDisposable.
Microsoft.Extensions.Hosting Новые методы ConfigureHostOptions упрощают настройку приложения.
Microsoft.Extensions.Logging В Microsoft.Extensions.Logging реализован новый генератор исходного кода для высокопроизводительных API ведения журналов. Генератор исходного кода активируется при добавлении нового LoggerMessageAttribute в метод ведения журналов partial. Во время компиляции генератор создает реализацию метода partial, который, как правило, действует быстрее во время выполнения, чем существующие решения ведения журналов. Дополнительные сведения см. в статье Создание исходного кода ведения журналов во время компиляции.

Новые API-интерфейсы LINQ

В .NET 6 было добавлено множество методов LINQ. Большинство новых методов, приведенных в таблице ниже, имеют эквивалентные методы в типе System.Linq.Queryable.

Метод Описание
Enumerable.TryGetNonEnumeratedCount<TSource>(IEnumerable<TSource>, Int32) Пытается определить количество элементов в последовательности без принудительного перечисления.
Enumerable.Chunk<TSource>(IEnumerable<TSource>, Int32) Разделяет элементы последовательности на фрагменты указанного размера.
Enumerable.MaxBy и Enumerable.MinBy Находит максимальные или минимальные элементы с помощью селектора ключа.
Enumerable.DistinctBy, Enumerable.ExceptBy, Enumerable.IntersectBy и Enumerable.UnionBy Эти новые разновидности методов, выполняющих операции на основе наборов, позволяют указывать равенство с помощью функции селектора ключа.
Enumerable.ElementAt<TSource>(IEnumerable<TSource>, Index) и Enumerable.ElementAtOrDefault<TSource>(IEnumerable<TSource>, Index) Принимает индексы, отсчитываемые от начала или конца последовательности, например возвращает Enumerable.Range(1, 10).ElementAt(^2)9.
Enumerable.FirstOrDefault<TSource>(IEnumerable<TSource>, TSource) и Enumerable.FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
Enumerable.LastOrDefault<TSource>(IEnumerable<TSource>, TSource) и Enumerable.LastOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
Enumerable.SingleOrDefault<TSource>(IEnumerable<TSource>, TSource) и Enumerable.SingleOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
Новые перегрузки позволяют указывать значение по умолчанию, которое будет использоваться, если последовательность пуста.
Enumerable.Max<TSource>(IEnumerable<TSource>, IComparer<TSource>) и Enumerable.Min<TSource>(IEnumerable<TSource>, IComparer<TSource>) Новые перегрузки позволяют указывать функцию сравнения.
Enumerable.Take<TSource>(IEnumerable<TSource>, Range) Принимает аргумент для Range упрощения создания среза последовательности, например, можно использовать source.Take(2..7) вместо source.Take(7).Skip(2).
Enumerable.Zip<TFirst,TSecond,TThird>(IEnumerable<TFirst>, IEnumerable<TSecond>, IEnumerable<TThird>) Создает последовательность кортежей с элементами из трех указанных последовательностей.

Улучшения даты, времени и часового пояса

В .NET 6 были добавлены следующие две структуры: System.DateOnly и System.TimeOnly. Они представляют часть даты и часть времени DateTime, соответственно. DateOnly можно использовать для дней рождения и годовщин, а TimeOnly подходит для ежедневных оповещений и еженедельных рабочих часов.

Теперь в любой операционной системе с установленными данными о часовом поясе можно использовать функцию управления адресными пространствами Интернета (IANA) или идентификаторы часовых поясов Windows. Метод TimeZoneInfo.FindSystemTimeZoneById(String) был обновлен для автоматического преобразования входных данных из часового пояса Windows в часовой пояс IANA (или наоборот), если запрошенный часовой пояс не найден в системе. Кроме того, были добавлены новые методы TryConvertIanaIdToWindowsId(String, String) и TryConvertWindowsIdToIanaId для сценариев, когда по-прежнему необходимо вручную выполнять преобразование из одного формата часового пояса в другой.

Также доступны и другие улучшения часовых поясов. Дополнительные сведения см. в статье Улучшения даты, времени и часовых поясов в .NET 6.

Класс PriorityQueue

Новый класс PriorityQueue<TElement,TPriority> представляет коллекцию элементов, имеющих и значение, и приоритет. Элементы удаляются из очереди в порядке увеличения приоритета, т. е. сначала выдается из очереди элемент с наименьшим значением приоритета. Этот класс реализует структуру данных минимальной кучи.

См. также раздел