Microsoft .NET 8 вышла 14 ноября с множеством новых функций и улучшений. В этой статье обсуждаются, с моей точки зрения, самые важные особенности .NET 8 и приводятся некоторые примеры кода, которые помогут вам начать работу с новыми функциями.
Чтобы использовать примеры кода, представленные в этой статье, в вашей системе должна быть установлена Visual Studio 2022. Если у вас еще нет копии, вы можете скачать Visual Studio 2022 здесь.
Создание проекта консольного приложения .NET Core в Visual Studio.
Прежде всего давайте создадим проект консольного приложения .NET Core в Visual Studio. Предполагая, что в вашей системе установлена Visual Studio 2022, выполните действия, описанные ниже, чтобы создать новый проект консольного приложения .NET Core.
- Запустите интегрированную среду разработки Visual Studio.
- Нажмите «Создать новый проект».
- В окне «Создать новый проект» выберите «Консольное приложение (.NET Core)» из списка отображаемых шаблонов.
- Нажмите “Далее.
- В окне «Настроить новый проект» укажите имя и местоположение нового проекта.
- Нажмите “Далее.
- В следующем окне «Дополнительная информация» выберите «.NET 8.0» в качестве версии платформы, которую вы хотите использовать.
- Нажмите Создать.
Мы будем использовать этот проект консольного приложения .NET Core для работы с лучшими новыми функциями .NET 8 в последующих разделах этой статьи.
Улучшения сборщика мусора
Сборщик мусора .NET теперь позволяет динамически регулировать ограничения памяти для облачных приложений, особенно для тех, которые работают в Kubernetes. Эта функция будет особенно полезна в сценариях, где службы размещаются в облачной среде.
Чтобы использовать эту функцию, вызовите API RefreshMemoryLimit():
GC.RefreshMemoryLimit();
В следующем фрагменте кода показано, как можно обновить настройки GC, относящиеся к ограничению памяти.
AppContext.SetData("GCHeapHardLimit", (ulong)100 * 1_024 * 1_024); GC.RefreshMemoryLimit();
Улучшения JSON
В функции сериализации и десериализации JSON в .NET было внесено несколько улучшений. Сюда входит поддержка аппаратного обеспечения с плавающей запятой и поддержка новых числовых типов, таких как полуструктуры.
Кроме того, при десериализации данных в более ранних версиях .NET любое свойство в полезных данных JSON, не являющееся типом POCO, будет игнорироваться. С помощью .NET 8 вы можете сделать все элементы данных доступными в полезной нагрузке JSON.
Чтобы использовать эту новую добавленную функциональность, вы должны аннотировать свой тип POCO атрибутом System.Text.Json.Serialization.JsonUnmappedMemberHandlingAttribute. Это показано в фрагменте кода, приведенном ниже.
[JsonUnmappedMemberHandling(JsonUnmappedMemberHandling.Disallow)] public class Employee { public int Employee_Id { get; set; } }
Теперь, если вы десериализуете экземпляр класса «Сотрудник», в котором указано имя члена, не являющееся частью типа POCO, будет выдано исключение JsonException. Например:
JsonSerializer.Deserialize<Employee> ("""{"Employee_Id" : 1, "Department_Id" : 1 }""");
Ниже приведено сообщение об исключении, которое вы увидите при выполнении приведенного выше кода:
// JsonException : The JSON property 'Department_Id' could not be mapped to // any .NET member contained in type 'Employee'.
Абстракция времени
Недавно добавленный класс TimeProvider и интерфейс ITimer обеспечивают функциональность абстракции времени, что позволяет вам имитировать время в тестовых сценариях. Функциональность абстракции времени обеспечивает поддержку следующего:
- Создать новый экземпляр таймера
- Получить местное время или время UTC
- Получить временную метку для измерения производительности
Абстрактный класс TimeProvider спроектирован таким образом, чтобы его можно было интегрировать с платформами макетирования, предоставляя методы, которые обеспечивают плавное и всеобъемлющее макетирование всех его аспектов.
Улучшения криптографии
Поскольку киберугрозы распространяются по всему миру, новая поддержка SHA-3 делает приложения .NET 8 более безопасными, предоставляя альтернативу SHA-2. Также в .NET 8 эфемерные операции RSA были перенесены в bcrypt.dll, а не в ncrypt.dll, что позволяет избежать необходимости выполнять удаленный вызов процедуры lsass.exe.
Тип System.Security.Cryptography.RandomNumberGenerator в .NET 8 представляет различные методы использования случайности. Этими методами являются метод GetItems() для случайного выбора элементов из входного набора и метод Shuffle() для уменьшения систематической ошибки обучения в машинном обучении.
Улучшения сжатия
Сжатие файлов из каталога с помощью потока теперь возможно без необходимости их кэширования. Это позволяет напрямую управлять памятью результата сжатия. Когда дисковое пространство ограничено, эти API становятся полезными, поскольку устраняют необходимость в промежуточных операциях с диском.
Пространство имен System.IO.Compression теперь включает в себя несколько API как часть класса ZipFile, как показано ниже.
namespace System.IO.Compression; public static partial class ZipFile { public static void CreateFromDirectory(string sourceDirectoryName, Stream destination); public static void CreateFromDirectory(string sourceDirectoryName, Stream destination, CompressionLevel compressionLevel, bool includeBaseDirectory); public static void CreateFromDirectory(string sourceDirectoryName, Stream destination, CompressionLevel compressionLevel, bool includeBaseDirectory, Encoding? entryNameEncoding); public static void ExtractToDirectory(Stream source, string destinationDirectoryName) { } public static void ExtractToDirectory(Stream source, string destinationDirectoryName, bool overwriteFiles) { } public static void ExtractToDirectory(Stream source, string destinationDirectoryName, Encoding? entryNameEncoding) { } public static void ExtractToDirectory(Stream source, string destinationDirectoryName, Encoding? entryNameEncoding, bool overwriteFiles) { } }
Улучшения встроенной компиляции AOT
Поддержка встроенной предварительной компиляции (AOT) была впервые представлена в .NET 7. В .NET 8 Microsoft добавила встроенную поддержку AOT для архитектур x64 и Arm64 в macOS и значительно уменьшила размер работающих собственных приложений AOT. на Линуксе.
Улучшения генерации кода
В .NET 8 Microsoft также внесла ряд улучшений в генерацию кода и JIT-компиляцию:
- Повышенная производительность контейнерных приложений в облачных средах.
- Улучшения SIMD для улучшения распараллеливания
- Улучшения оптимизации на основе профиля (PGO)
- Динамический PGO включен по умолчанию
- Улучшения производительности архитектуры Arm64.
- Улучшения JIT для более быстрой генерации кода
Другие улучшения производительности
Производительность — это область, которой Microsoft уделяет все больше внимания в последних выпусках .NET. Вот некоторые другие ключевые улучшения производительности в .NET 8.
Улучшения в List.AddRange(IEnumerable)
AddRange(IEnumerable
Улучшения в Int32.ToString()
Метод Int32.ToString() был улучшен для повышения производительности за счет кэширования строковых значений в памяти.
Введение пространства имен System.Collections.Frozen
System.Collections.Frozen представляет два новых класса коллекций: FrozenSet
Следующий фрагмент кода показывает, как можно использовать FrozenSet.
using System.Collections.Frozen; List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]; FrozenSet<int> frozenSet = numbers.ToFrozenSet(); foreach (int i in frozenSet) Console.WriteLine(i); Console.ReadLine();
Когда вы запустите приведенный выше фрагмент кода, все элементы целочисленного массива будут отображаться в окне консоли.
дальнейшее чтение
Вот несколько онлайн-ресурсов, на которых вы можете получить дополнительную информацию о .NET 8:
- Microsoft Learn: на веб-сайте Microsoft Learn есть веб-страница, на которой описаны все новые и улучшенные функции .NET 8.
- Документация GitHub. Вы также можете найти информацию о новых функциях .NET 8 в репозитории GitHub для документации .NET и .NET Core.
- Веб-сайт .NET: на официальном веб-сайте Microsoft .NET есть веб-страница, на которой можно найти более подробную информацию о .NET 8.
- Блоги .NET и форумы сообщества .NET. Возможно, вам захочется изучить блоги и форумы сообщества, где разработчики делятся своим опытом и знаниями относительно функций и обновлений .NET. Эти платформы отлично подходят для обсуждения того, что нового в конкретной версии .NET.
Выпуск .NET 8 от Microsoft — это большой шаг вперед в создании масштабируемых, безопасных, надежных и производительных приложений. С выпуском .NET 8 стал доступен и C# 12. Скоро я напишу здесь пост о новых возможностях C# 12.
Дальше читайте это:
- Лучшее программное обеспечение с открытым исходным кодом 2023 года
- Сертификаты программирования все еще имеют значение?
- Облачные вычисления больше не являются пустяком
- Что такое генеративный ИИ? Искусственный интеллект, который создает
- Программирование с помощью ИИ: советы и лучшие практики от разработчиков
- Почему Wasm — это будущее облачных вычислений