Что нового в .NET 10
|
.NET 10 выходит как релиз с длительной поддержкой (LTS), включающей три года обновлений. В этом обновлении Microsoft сфокусировались на нескольких направлениях: производительность, оптимизация памяти, улучшение кроссплатформенности и расширение возможностей языка C#. Одним из наиболее значимых изменений .NET 10 является снижение накладных расходов абстракции в коде. Это значит, что разработчики могут писать высокоуровневый код, который работает почти так же быстро, как низкоуровневый. JIT-компилятор получил значительные улучшения, позволяющие девиртуализировать вызовы методов интерфейса массива и выделять небольшие массивы значимых типов прямо в стеке. .NET 10 также предлагает значительные улучшения в работе с сертификатами, JSON-сериализацией и обработкой архивов. SDK претерпел изменения, которые упрощают управление зависимостями и сокращают размер проектов. ASP.NET Core 10 существенно улучшает работу с Blazor, SignalR и Minimal API, а также добавляет поддержку OpenAPI 3.1, что делает документацию API более точной и лучше структурированной. MAUI продолжает развиваться, предлагая улучшения как для мобильных платформ, так и для десктопных приложений. Entity Framework Core также был оптимизирован, особенно в переводе LINQ-запросов и выполнении обновлений базы данных. Производительность и оптимизацияВсем нравится, когда ПО работает быстро и Microsoft это понимает (наверно), поэтому в .NET 10 производительность стала одной из основных частей обновления. Девиртуализация методов интерфейса массиваОдно из наиболее полезных улучшений касается работы со стандартными коллекциями. JIT-компилятор в .NET 10 теперь умеет девиртуализировать вызовы методов интерфейса при работе с массивами. На практике это означает, что код, использующий абстракции вроде IEnumerable<T>, теперь может выполняться почти так же быстро, как и прямые операции с массивами. До этого при использовании foreach для перебора массива через интерфейс IEnumerable<int> создавались виртуальные вызовы, которые препятствовали таким оптимизациям, как встраивание функций и устранение проверок границ:
Стековое размещение массивов значимых типовЕще одно улучшение — возможность размещать в стеке небольшие массивы, содержащие значимые типы. В предыдущих версиях .NET даже крошечный массив из трёх целых чисел всегда выделялся в куче, что создавало дополнительную нагрузку на сборщик мусора:
numbers имеет фиксированный размер и не выходит за пределы метода Sum(), поэтому размещает его прямо в стеке. Это не только снижает нагрузку на сборщик мусора, но и улучшает локальность данных в кэше процессора, что может дать дополнительный прирост производительности.Поддержка AVX10.2.NET 10 добавляет также поддержку набора инструкций Advanced Vector Extensions (AVX) 10.2 для процессоров x64. Хотя на момент выхода .NET 10 оборудование с поддержкой AVX10.2 ещё не доступно, фреймворк уже готов использовать эти инструкции для ускорения векторных вычислений. Это открывает новые возможности в области высокопроизводительных вычислений, обработки графики и машинного обучения. Как только соответствующее железо появится на рынке, код на .NET сможет автоматически использовать преимущества новых инструкций SIMD (Single Instruction, Multiple Data). Нативная компиляция (Native AOT)Native AOT (Ahead-of-Time) компиляция значительные улучшена в .NET 10. Эта технология позволяет превратить .NET-код в нативный исполняемый файл для конкретной платформы ещё на этапе сборки проекта, минуя JIT-компиляцию во время выполнения. В .NET 10 расширена поддержка фреймворка для Native AOT и теперь она включает больше API и библиотек. Скорость запуска и потребление памяти приложений скомпилированных с помощью Native AOT теперь значительно лучше, а список поддерживаемых сценариев расширен. Особенно впечатляющие результаты Native AOT показывает в контейнеризированных микросервисах, где быстрый запуск и низкое потребление памяти критически важны. Приложения, построенные с использованием минимального API ASP.NET Core и скомпилированные через Native AOT, могут стартовать почти мгновенно и потреблять в несколько раз меньше памяти по сравнению с традиционными подходами. Улучшения в сборке мусораСборщику мусора (Garbage Collector, GC) также отсыпали оптимизаций в .NET 10. Одним из заметных улучшений стало более эффективное управление большими объектами (Large Object Heap, LOH). В предыдущих версиях размещение и освобождение крупных объектов часто приводило к фрагментации памяти и снижению производительности. В .NET 10 алгоритмы работы с LOH были пересмотрены, что привело к более эффективному использованию памяти и снижению накладных расходов на сборку мусора. Также были внесены улучшения в сервер-режим GC, который теперь лучше масштабируется на многоядерных системах и показывает более предсказуемую производительность под высокой нагрузкой. Динамические профили оптимизации PGOТехнология Profile-Guided Optimization (PGO) в .NET 10 вышла на новый уровень. PGO позволяет JIT-компилятору использовать данные о реальном использовании приложения для более агресивной оптимизации часто выполняемых участков кода. Теперь PGO умнее принимает решения о встраивании функций, разворачивании циклов и других оптимизациях, основываясь на реальных шаблонах использования. Это особенно заметно в крупных приложениях с разнообразной нагрузкой, где "горячий путь" может меняться в зависимости от сценария использования. В .NET 10 также серьезно переработали механизмы обработки строк. Строки остаются одним из самых часто используемых типов данных, и оптимизация работы с ними дает прирост производительности в большинстве приложений. Значительно улучшены алгоритмы сравнения, конкатенации и поиска подстрок. Особенно заметна разница при работе с локализованными строками в различных культурах, где прирост производительности может достигать 30-40%. Системные типы System.Threading.Channels и System.Threading.Tasks получили оптимизации, снижающие накладные расходы при обмене данными между потоками. Переработана внутренняя реализация ValueTask и ValueTask<T>, что позволило сократить выделение памяти при асинхронном программировании.Бенчмарки показывают, что на типовых веб-приложениях .NET 10 может обрабатывать на 15-20% больше запросов в секунду по сравнению с .NET 8 (предыдущей LTS-версией) при том же потреблении ресурсов. Для вычислительно-интенсивных операций, активно использующих SIMD-инструкции, прирост может быть ещё более значительным. Многие оптимизации .NET 10 были введены по реальному опыту использования фреймворка в хайлоаде. Разработчики Microsoft активно анализировали профили производительности крупных приложений и фокусировались на улучшении тех компонентов, которые вызывали наибольшие проблемы в реальных сценариях. Что лучше выбрать VB.NET или C.NET (C#)? Что такое .NET и всё что с ним связано Асинхронность и парралелелизм в .NET: что есть что? Что такое .NET? Новые возможности C# 14С выходом .NET 10 мы получаем новую версию языка — C# 14. Что же он нам принесёт? Новое ключевое слово fieldОдно из самых заметных изменений — ключевое слово field, которое упрощает работу с аксессорами свойств, избавляя от необходимости явно объявлять поле. В прежних версиях C# при написании свойства с логикой установки значения (например, для проверки на null) требовалось явно объявлять приватное поле:
field компилятор автоматически генерирует такое поле:
field, придётся использовать @field или this.field для разрешения конфликта имён.Неявные преобразования для Span<T> и ReadOnlySpan<T>C# 14 добавляет поддержку для Span<T> и ReadOnlySpan<T>, что позволяет лучше использовать эти типы в сочетании с обычными массивами. Раньше при работе с методами, принимающими Span<T>, приходилось явно преобразовывать массивы или строки:
Span<T> позволяет избежать лишних выделений памяти. Неявные преобразования делают код чище и понятнее, но могут создавать неоднозначности при выборе перегрузок методов. Компилятор теперь отдаёт предпочтение версиям с Span<T>, что может неожиданно изменить поведение существующего кода при миграции на .NET 10.Unbound Generic Types в nameofОператор nameof в C# 14 расширяет свои возможности и теперь может работать с необобщёнными (unbound) типами.До этого оператор nameof с обобщёнными типами возвращал только имя типа без информации о параметрах типа:
nameof с необобщённым типом:
Модификаторы для параметров простых лямбда-выраженийC# 14 позволяет добавлять модификаторы параметров ( scoped, ref, in, out, ref readonly) к лямбда-выражениям с неявной типизацией.В C# 13 для использования модификаторов параметров в лямбда-выражениях требовалось явно указывать типы:
Применение новых возможностейСовместное использование нескольких новых возможностей C# 14:
Подводные камни и ограниченияНе смотря на преимущества, новые возможности C# 14 имеют и свои ограничения: 1. Ключевое слово field может вызвать конфликты имён в существующем коде, особенно если там уже используется идентификатор с таким именем.2. Неявные преобразования для Span<T> могут изменить поведение существующего кода при миграции на .NET 10, особенно если в нём есть методы с перегрузками, принимающими и обычные коллекции, и Span<T>.3. Модификаторы для параметров лямбда-выражений могут создавать неоднозначности в сложных сценариях вывода типов. 4. Необобщённые типы в nameof — возможность узкоспециализированная и будет полезна в основном для сценариев метапрограммирования и генерации кода.Улучшения библиотек и инструментовНовая версия .NET не только повышает производительность и добавляет языковые возможности, но и улучшает базовые библиотеки. В .NET 10 многие компоненты были переработаны с учётом отзывов сообщества и реальных сценариев использования. Работа с сертификатами и криптографическими функциямиКоманда разработчиков .NET серьёзно улучшила работу с сертификатами, добавив поддержку современных алгоритмов хеширования при поиске сертификатов по отпечатку. Если раньше метод X509Certificate2Collection.Find ограничивался использованием устаревшего SHA-1, то теперь появился новый метод, позволяющий указать алгоритм хеширования:
PemEncoding может работать напрямую с данными в формате ASCII/UTF-8, что устраняет необходимость в ручном преобразовании при чтении файлов:
Оптимизации базовых типов данныхУлучшена работа со стандартными типами данных. Например, класс ISOWeek получил новые перегрузки для работы с типом DateOnly:
DateOnly в DateTime для еженедельных расчётов, что может быть актуально для бизнес-приложений с интенсивной обработкой дат.Класс ZipArchive, используемый для работы с ZIP-архивами, тоже был изменён:1. Оптимизирован режим обновления — теперь редактирование файлов внутри ZIP не требует загрузки всех записей в память, что снижает потребление ресурсов. 2. Распаковка архивов стала параллельной, данные обрабатываются одновременно на разных потоках, а внутренние структуры данных оптимизированы для снижения потребления памяти. System.Text.Json и работа с коллекциямиSystem.Text.Json продолжает развиваться в попытке догнать популярную библиотеку Newtonsoft.Json. В .NET 10 добавлена поддержка ReferenceHandler в JsonSourceGenerationOptions, что позволяет настраивать обработку циклических ссылок при использовании генераторов исходного кода для сериализации JSON:
Также улучшен тип OrderedDictionary<TKey, TValue>, который теперь предоставляет новые перегрузки методов TryAdd и TryGetValue, возвращающие индекс записи. Это делает доступ к данным более эффективным и позволяет быстро выполнять обновления:
Оптимизация SDK и управление зависимостямиSDK .NET 10 представляет изменения в управлении зависимостями. Функция NuGet Audit может автоматически удалять неиспользуемые ссылки на пакеты, предоставляемые фреймворком. Она включена по умолчанию для целевых фреймворков .NET 8.0, .NET 10.0 и .NET Standard 2.0 и выше. Когда она активирована, сгенерированный файл .deps.json приложения содержит меньше ссылок на пакеты, так как те, что уже предоставляются средой выполнения .NET, автоматически исключаются.Если по каким-то причинам вам требуется сохранить все ссылки на пакеты фреймворка, вы можете отключить эту функцию, добавив следующее свойство в файл .csproj или Directory.Build.props:
ASP.NET Core: свежий ветер в веб-разработкеASP.NET Core 10 добавляет множество улучшений в различные компоненты веб-фреймворка. Для Blazor добавлен параметр RowClass в компоненте QuickGrid, позволяющий динамически применять CSS-классы к строкам сетки на основе данных строки:
ASP.NET Core 10 также добавляет поддержку OpenAPI 3.1, которая соответствует черновику JSON Schema 2020-12. Это делает документацию API более точной и лучше структурированной, хотя и вносит некоторые критические изменения:
Одним из изменений в OpenAPI 3.1 является замена OpenApiAny на JsonNode. Это затрагивает все версии OpenAPI, даже если OpenAPI 3.0 указан явно:
[ProducesResponseType] теперь поддерживает необязательный параметр описания, делающий документацию API более понятной:
Инструменты диагностики и отладки.NET 10 улучшает поддержку тестирования приложений с выражениями верхнего уровня. Раньше для приложений с выражениями верхнего уровня (появившихся в C# 9+) разработчикам приходилось вручную объявлять:
Program. В .NET 10 генератор исходного кода автоматически создаёт public partial class Program, если он не объявлен явно. А если разработчик добавляет его вручную, новый анализатор предложит удалить его во избежание избыточности.Кроссплатформенность и контейнерыКроссплатформенность всегда была одной из основ .NET, и в версии 10 этот аспект получил развитие. .NET MAUI: новая эра мобильной разработки.NET MAUI в версии 10 сфокусирован в основном на улучшении качества и стабильности работы. Одним из заметных улучшений стал переход на использование оптимизированных обработчиков для элементов CollectionView и CarouselView на iOS и Mac Catalyst. В .NET 9 эти обработчики были представлены как опциональные, но в .NET 10 они стали использоваться по умолчанию, что значительно повысило скорость работы и стабильность этих элементов управления.
Android: шаг вперёд.NET 10 вносит впечатляющие улучшения в поддержку Android. Теперь фреймворк включает поддержку API 36 (Android 16 "Baklava") и JDK 21, что позволяет разработчикам использовать новейшие возможности платформы. Минимальный рекомендуемый уровень API был повышен с 21 (Lollipop) до 24 (Nougat). Хотя API 21 по-прежнему поддерживается, переход на API 24 рекомендуется для предотвращения проблем с методами интерфейсов Java по умолчанию. Одним из самых важных улучшений стала поддержка команды dotnet run для проектов Android. Раньше эта команда не работала для Android-проектов из-за отсутствия параметров для указания целевого устройства или эмулятора. В .NET 10 это ограничение снято:
Для разработчиков библиотек добавлена возможность указывать альтернативное имя файла артефакта при использовании @(AndroidMavenLibrary):
iOS, macOS и tvOS.NET 10 обновил поддержку Apple-платформ до последних версий: iOS: 18.2 tvOS: 18.2 Mac Catalyst: 18.2 macOS: 15.2 Предупреждения триммера, ранее подавленные из-за проблем в базовой библиотеке классов, теперь включены по умолчанию, что помогает выявлять потенциальные проблемы при создании AOT-компилируемых приложений. Проекты библиотек .NET MAUI могут содержать связанные ресурсы, такие как раскадровки, файлы xib, изображения и модели CoreML. В .NET 9 была добавлена опциональная поддержка для встраивания оригинальных ресурсов в библиотеки, а в .NET 10 это поведение включено по умолчанию, что упрощает сборку и даёт больше контроля над обработкой ресурсов. Контейнеризация и Docker: прорыв в мире микросервисовПроизводительность контейнеризированных приложений .NET выросла благодаря оптимизациям среды выполнения и уменьшению размера базовых образов. Одно из ключевых улучшений — улучшенная поддержка публикации контейнеров в .NET Aspire 9.1. Метод .PublishAsDockerfile() теперь работает со всеми проектами и исполняемыми ресурсами, обеспечивая лучшую настройку контейнеров:
Добавлена полная поддержка компиляции Native AOT для контейнеризированных приложений. Это позволяет создавать компактные контейнеры с быстрым временем запуска и низким потреблением памяти, что подходит для микросервисной архитектуры:
Интеграция с облачными сервисами.NET 10 предоставляет улучшенную интеграцию с облачными сервисами, особенно с Azure. Разработчики теперь могут определять очереди Service Bus, темы и Event Hubs непосредственно в коде хоста приложения Aspire:
Значительно улучшена поддержка gRPC. В .NET 10 оптимизирована производительность gRPC, снижены накладные расходы на сериализацию и улучшена интеграция с контейнерами:
Критический взгляд и перспективыОценивая .NET 10 в сравнении с предыдущими версиями, заметен существенный прогресс в производительности и расширении возможностей платформы. Однако задаешься вопросом: насколько эти улучшения действительно необходимы рядовому разработчику? Большинство оптимизаций производительности, таких как девиртуализация методов интерфейса массива и стековое размещение массивов значимых типов, могут быть заметны в высоконагруженных системах и микросервисах. Для типичных бизнес-приложений эти улучшения могут оказаться малозаметными. Некоторые эксперты отмечают, что .NET 10, будучи LTS-версией, предлагает достаточно сбалансированный набор улучшений. Джеймс Монтемагно подчеркивает ценность долгосрочной поддержки: "Для корпоративных клиентов .NET 10 предлагает идеальный баланс между инновациями и стабильностью". При этом Марк Гравелл: "Некоторые долгожданные функции, например улучшения в JSON-сериализации, решают проблемы, с которыми сообщество боролось годами". Пожалуй, главным недостатком остаётся необходимость миграции и потенциальное влияние критических изменений на существующие кодовые базы. Особенно это касается изменений в C# 14, которые могут незаметно изменить поведение программы при выборе перегрузок методов с параметрами Span<T>. Что такое .NET? Что такое .net? Что такое NET и C# Что с сайтом pinvoke.net? Что требуют от .NET-программиста? Что такое .NET Framework Что легче c# или vb.net Что такое Microsoft .NET Framework ? Перевести из VBA в что нибудь из .NET Что должен знать .net программист? Что есть у .NET чего нет у J2EE? А кто уже что-нибудь сделал на .NET? | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||


