Бөлісу құралы:


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

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

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

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

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

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

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

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

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

Performance

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

FileStream

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

Оптимизация с использованием профиля

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

Кроссген2

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

Поддержка Arm64

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

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

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

.NET MAUI

Многоплатформенный пользовательский интерфейс приложений .NET (.NET MAUI) по-прежнему находится в предварительной версии, с кандидатом на выпуск в первом квартале 2022 года и общедоступной доступностью (GA) во втором квартале 2022 года. .NET MAUI позволяет создавать собственные клиентские приложения для настольных и мобильных операционных систем с помощью одной базы кода. Дополнительные сведения см. в записи блога об обновлении многоплатформенного пользовательского интерфейса приложений .NET .

C# 10 и шаблоны

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

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

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

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

F# и Visual Basic

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

Visual Basic имеет улучшения в интерфейсе Visual Studio и запуске проекта Windows Forms.

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

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

Command Description
Поиск рабочей нагрузки dotnet Выполняет поиск доступных рабочих нагрузок.
установка рабочей нагрузки dotnet Устанавливает указанную рабочую нагрузку.
Удаление рабочей нагрузки dotnet Удаляет указанную рабочую нагрузку.
Обновление рабочей нагрузки dotnet Обновляет установленные рабочие нагрузки.
Восстановление рабочей нагрузки dotnet Переустановка всех установленных рабочих нагрузок для восстановления сломанной установки.
Список рабочих нагрузок dotnet Выводит список установленных рабочих нагрузок.

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

API System.Text.Json

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

Генератор источника

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

Доступная для записи модель DOM

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

Дополнительные сведения см. в разделе "Варианты JSON DOM".

Сериализация для 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 добавляет предварительную поддержку для двух ключевых мер безопасности: технологии управления потоком (CET) и "запись с исключительным выполнением" (W^X).

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

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

Обрезка IL

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

Анализ кода

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

Настраиваемые механизмы защиты платформы

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

Windows Forms

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

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

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

Исходная сборка

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

Идентификаторы целевого фреймворка

Для .NET 6 добавлены дополнительные моникеры целевой платформы, например net6.0-android, net6.0-ios и net6.0-macos. Дополнительные сведения см. в разделе TFM для конкретной ОС.

Общая математика

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

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

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

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

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

API отражения

В .NET 6 представлены следующие новые API, которые проверяют код и предоставляют сведения о допустимости null:

Эти интерфейсы программного приложения (API) полезны для инструментов и сериализаторов, основанных на отражении.

API Microsoft.Extensions

Несколько пространств имен расширений имеют улучшения в .NET 6, как показано в следующей таблице.

Namespace Improvements
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 .

Метод Description
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> класс представляет коллекцию элементов, имеющих как значение, так и приоритет. Элементы удаляются в порядке возрастания приоритета—то есть элемент с наименьшим значением приоритета будет удалён первым. Этот класс реализует структуру данных типа минимальная куча.

См. также