Подробнее о том, что находится под капотом .NET 6, в дополнение к нашему предыдущему сообщению на эту тему.

Похоже, что эта блокировка не была сложной для Microsoft. В этом году открылся Plenty’s Horn, и нас засыпали новыми программными продуктами — и долгожданной Windows 11, и новой Visual Studio 22, и, конечно же, .NET Framework 6.0. Это хорошая новость в эти плохие времена.

Поговорим о самом интересном для разработчиков новом продукте — .NET 6.0. Едва разработчики портировали свои проекты на NET 5.0, как вышла новая версия. Забегаю вперед, чтобы сказать очевидную истину, что 6-я версия не является чем-то принципиально новым — это «добитая» пятая версия. Большинство изменений включают модифицированные или переработанные решения из прошлогоднего релиза, но шестая версия получила статус LTS (Long Time Support) — она стала версией с долгосрочной поддержкой. Отныне так будет во всех четных версиях.

Как вы помните, начиная с .NET 5.0 Microsoft решила объединить все свои фреймворки в один. Это было сделано для того, чтобы избавиться от «неоднородности». То есть мы пришли к изначальной концепции .NET Framework, но теперь это не монолит, а выглядит вот так.

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

1. Crossgen2 — предварительная компиляция

Обновленная утилита Crossgen теперь имеет вторую версию. Старая технология предварительной компиляции была, прямо скажем, несовершенной и позволяла генерировать нативный код только для платформы, на которой работала старая утилита crossgen. Теперь он позволяет запускать JIT-компилятор независимо от платформы, используя разные стратегии и оптимизации в зависимости от ситуации.

2. Профильная оптимизация (PGO)

Это оптимизация компилятора для определения приоритетов компиляции частей приложения. Дело в том, что не все части программы используются при выполнении или используются крайне редко. Например, какие-нибудь экзотические еще если ветки. Мы можем улучшить производительность приложения, если укажем на часто выполняемые области. Теперь можно включить анализатор, который в процессе выполнения определит часто и редко используемые области, а также сгенерирует профиль оптимизации. Существует три сценария оптимизации:

  • Статика — код разбивается на часто и редко исполняемый (горячее-холодное разбиение). В этом случае профиль оптимизации создается только один раз. Если условия работы приложения изменятся, вам придется сгенерировать его заново и заново оптимизировать. Этот подход соответствует наиболее часто исполняемым областям приложения и помещает их вместе в исполняемый файл. Это загрузит его очень быстро, благодаря кешу. Очень редко исполняемый код не компилируется. При необходимости он будет скомпилирован во время выполнения приложения.
  • Динамический подход, при котором предварительный профиль оптимизации не создается. Анализатор следит за выполнением приложения во время реальной работы и перекомпилирует участки кода, если требуется оптимизация.
  • Смешанный подход говорит сам за себя. Здесь используются оба подхода. То есть приложение оптимизируется в соответствии с профилем оптимизации. Затем он корректируется во время работы по динамической схеме.

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

Вы будете особенно довольны этой функцией. Наконец-то отладка приложений стала действительно простой! Теперь вы можете начать отладку один раз и редактировать код в режиме реального времени. Вы поймете, как это работает, если вы когда-либо отлаживали javascript в своих проектах .NET Core.

Вы, наверное, помните что-то вроде «Редактировать и продолжить». У нас была возможность менять код во время выполнения, но это было не очень удобно. Вы должны были установить точки останова и приостановить приложение. Точка останова должна быть установлена ​​до момента отладки. Возможности редактирования также были очень ограничены.

https://docs.microsoft.com/en-us/visualstudio/debugger/supported-code-changes-csharp?view=vs-2019

Теперь мы можем исправить код прямо во время выполнения во время отладки. Затем сохраните изменения и смотрите их в режиме реального времени. Это значительно ускоряет процесс отладки, особенно если вы знаете, что и где исправлять, и хотите сразу увидеть результат, не перезапуская отладчик. И да, теперь это работает и в VS Code. Список доступных изменений краток и доступен здесь.

4. .NET МАУИ

В рамках глобализации или объединения всех платформ Microsoft добавляет поддержку Xamarin. Теперь у нас есть разработки для macOS, iOS и Android в VisualStudio. Однако это не будет работать в стандартном SDK. Вам потребуется установить необязательные дополнительные рабочие нагрузки SDK. На самом деле разработка становится все более удобной. Создание проекта на Android — дело команды:

dotnet new android

Они решили отказаться от названия Xamarin и теперь представили пользовательский интерфейс мультиплатформенного приложения или MAUI.

5. Минимальная структура API

Стоит рассказать об интересном инструменте Minimal API. Эта структура позволяет обойтись минимальным кодом для создания веб-методов и доступа к ним. Вам не нужно создавать привязку MVC, настраивать контроллер и заголовки методов для создания маршрутизации. Более того, вам также не понадобится Setup.cs. Все, что вам нужно, это Program.cs, где вы можете сразу разрабатывать веб-методы с маршрутизацией.

app.MapGet("/", (Func<string>)(() => "Hello World!"));

Безымянная функция вернет «Hello World!» для любого запроса. Это именно то, что нужно для микросервисов или прототипирования.

6. Поддерживаемые операционные системы

Microsoft опубликовала список всех поддерживаемых операционных систем, а именно:

  • Windows — Windows Client, Windows 10 Client, Windows 11, Windows Server, Windows Server Core, Nano Server;
  • МакОС;
  • Linux — Alpine Linux, CentOS, Debian, Fedora, openSUSE, Red Hat Enterprise Linux, SUSE Enterprise Linux (SLES), Ubuntu;
  • Мобильные — Android и iOS.

7. Поддержка архитектуры ARM64

Поддержка ARM64 была реализована в NET 5 для Windows. В шестой версии он был расширен до процессоров Apple ARM64.

8. Поддержка настольных приложений Blazor

Хотя Blazor — это фреймворк для веб-приложений, Microsoft решила сломать шаблон и включить разработку настольных приложений. Blazor, вероятно, доказал свою ценность.

9. Оптимизация MSBuild

Компилятор Razor был объединен с Roslyn Source Generators, что значительно ускорило сборку. Roslyn Source Generators был представлен в NET 5 и произвел фурор своей возможностью генерировать код C# на лету во время разработки.

10. Линк

Разработчики также работали над нашим любимым LINQ. С каждым выпуском .NET в этот язык добавляют что-то новое (особенно в .NET 5), и этот выпуск не стал исключением. За последние несколько лет LINQ стал быстрее, а дублирование кода сократилось. Вот небольшой список полезных функций:

  • Функция TryGetNonEnumeratedCount позволяет определить количество элементов в последовательности без их перечисления, тем самым значительно ускоряя работу приложения в некоторых случаях;
  • Функция Chunk разбивает элементы последовательности на определенное количество групп;
  • Функции MaxBy и MinBy позволяют найти максимальный или минимальный элемент для данного ключевого селектора;
  • Функции DistinctBy, ExceptBy, IntersectBy и UnionBy также позволяют выполнять действия в соответствии с селектором клавиш;
  • Функции ElementAt и ElementAtOrDefault возвращают элемент из определенного индекса с той разницей, что возвращают значение по умолчанию;
  • Наконец, функция FirstOrDefault может установить значение по умолчанию. «Ваши молитвы были услышаны», потому что не все были довольны нулем;
  • Функция Max теперь может принимать компаратор для сравнения значений;
  • Функция Take позволяет установить диапазон.

11. JSON

Ну как же мы могли забыть модификации библиотеки System.Text.JSON. Основные изменения коснулись сериализатора. А именно:

  • избегать циклических ссылок; Добавлен объект IAsyncEnumerable ‹T›, который превращается в массив;
  • Десериализация документа-массива, где появился метод DeserializeAsyncEnumerable.
  • Поддержка генераторов исходников — технологии сериализации без отражения, что значительно ускоряет и удешевляет работу приложения;
  • Добавлены новые интерфейсы IJsonOnDeserialized, IJsonOnDeserializing, IJsonOnSerialized, IjsonOnSerializing, содержащие одноименные обработчики событий. То есть вы можете выполнять любой код во время сериализации/десериализации;
  • Вы можете установить порядок сериализации полей, используя атрибут JsonPropertyOrder;
  • Десериализация из потока;
  • Еще одна очень интересная «фича» — поддержка работы с документами JSON как с DOM. Эта функция очень полезна, потому что иногда вы просто не хотите создавать объекты POCO для простых операций. Не забывайте, что DOM-подход к работе с JSON снижает производительность и чрезмерно использует ресурсы. Нас уверяют, что этого не произойдет, но насколько это правда, мы узнаем на практике.

12. HTTP/3

Протокол связи HTTP существует уже целую вечность. Всем известно, что он основан на другом протоколе, TCP, который существует еще дольше. Да, бурное развитие Интернета поставило http в затруднительное положение — он выглядит слабым звеном на фоне роста пропускной способности сети. Наконец-то мы получили третью версию этого замечательного протокола. Это не устранило проблемы, но значительно уменьшило их степень.

Новый протокол QUIC, пришедший на смену TCP, работает быстрее при потере пакетов. Это быстрее во время настройки соединения. Это позволяет осуществлять параллельную передачу данных. Кроме того, он по своей сути безопасен благодаря зашифрованным запросам.

13. Приоритетная очередь

Появился новый класс — PriorityQueue ‹TElement, TPriority›. Это позволяет вам установить приоритет для каждого добавленного элемента и создает очередь приоритетов. Эти элементы удаляются, начиная с самого низкого приоритета.

14. Дата/время

Разработчики также поработали с датой. Одни из самых интересных модификаций:

  • Появилось два новых метода System.DateOnly и System.TimeOnly, которые позволяют работать напрямую с датой или временем, а не с DateTime, как раньше.
  • Преобразование часовых поясов. То есть теперь вы можете использовать идентификатор Windows или IANA при определении зоны методом TimeZoneInfo.FindSystemTimeZoneById. Если поиск не находит идентификатор зоны одного типа, то время автоматически конвертируется в другой формат по второму типу идентификатора.

15. Поддержка С# 10

О новых возможностях 10 версии можно написать отдельную статью. Здесь я даже не буду упоминать самое интересное. Вы можете ознакомиться с этим списком изменений.

Подытожим — что предлагает .NET 6:

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

Разумеется, мы протестировали наши продукты на совместимость с новым фреймворком. FastReport работает на .NET 6 точно так же, как и на версии 5.

Можно сказать, что есть правильный вектор на консолидацию платформ, языков и технологий. Да, у молодого поколения меньше технических знаний, но они нам уже и не нужны. Так же, как автоматическая коробка передач вытесняет механическую. Люди просто должны ездить и не думать о передачах и оборотах двигателя. Как и многие современные разработчики, не хотят вдаваться в технические словечки тех или иных процессов. Теперь они могут наслаждаться творческим аспектом разработки программного обеспечения.