Обзор основных функций .NET 6

.NET 6 Изучение

.NET 6 наконец-то здесь, давая нам новую долгосрочную стабильную версию .NET Core .NET 6 пришла на смену.NET 5, которая, как правило, рассматривалась большинством из нас как «пропущенная версия», получившая ограниченное применение по сравнению с .NET Core 3.1. В этом выпуске мы получаем обновления как для среды выполнения, так и для языка C #. В этом посте мы более подробно рассмотрим три наиболее полезных функции.NET 6.

.NET

Многие люди, обновляющиеся для использования 6, будут переходить с 3.1, а не с 5, поэтому этот выпуск предоставит ряд улучшений как для среды выполнения, так и для поддерживающей экосистемы инструментов (например, dotnet).

Улучшения производительности в.NET 6

С момента своего первого выпуска одним из основных приоритетов.NET Core было повышение производительности, и.NET 6 продолжает эту тенденцию, предлагая более 500 PR, ориентированных на производительность.

Ключевыми направлениями этого обновления являются повышение скорости и эффективности как JIT, так и AOT-компиляции. Улучшенные встраивание и де-виртуализация (определение конкретного callite для виртуально отправляемого метода во время компиляции) обеспечивают солидный выигрыш.

Важным для нас стал улучшенный пул потоков для синхронизации тяжелых рабочих нагрузок. На порядок улучшено то, как пул потоков масштабирует количество потоков, когда он определяет, что существующие потоки блокируются слишком долго. Сам пул потоков также был перенесен на чистый управляемый код — еще одно подтверждение того, насколько производительна среда выполнения в наши дни.

Наконец, выполнение таких рутинных операций, как DateTime.UtcNow, было в центре внимания ряда PR. Вы могли подумать, что такая простая операция уже будет очень сильно оптимизирована, но это не всегда так. Таким образом, базовые общие библиотечные функции, такие как получение следующего случайного числа из System.Random или инициализация нового GUID, также видят двукратное ускорение порядка при переходе от.NET 5 к.NET 6.

Если вам интересно прочитать (много) об этом больше, включая ссылки на лежащие в основе PR, ознакомьтесь с постом Стивена Туба о любви по этой теме.

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

Теперь это, безусловно, одна из лучших функций.NET 6, учитывая все споры о том, чтобы ограничить ее доступ только для пользователей Visual Studio. Это не разочаровывает и возвращает часть быстрой разработки, о которой с любовью вспоминают старожилы с Visual Basic 6, позволяя вам изменять исходный код во время выполнения и мгновенно отражать это (например, при следующем вызове метода).

Раньше у нас были часы dotnet, которые отслеживали исходный код и перестраивали приложение при обнаружении изменений. Для более крупных приложений время сборки становится немного затруднительным, особенно при изменении точки в конкретной функции. По сути, это не отличается от обычного рабочего процесса внесения изменений, компиляции кода и последующего наблюдения за применением этих изменений. Hot Reload развивает эту концепцию еще на один шаг, ограничивая объем перекомпиляции методами, на которые действительно повлияло изменение.

Основное внимание при этом улучшении уделяется веб-разработке, а горячая перезагрузка охватывает как серверный код ASP.NET, так и серверный и клиентский код Blazor. Подобные улучшения производительности всегда приветствуются!

Читайте также:  10 встроенных функций Python, которые вы должны знать

Объединение одного файла

Для развертывания приложений.NET вам по-прежнему потребуется доступная среда выполнения. Просьба пользователей установить обновленную среду выполнения (например,.NET 6) часто оказывается препятствием для входа. В более ранних выпусках вы могли скомпилировать один выходной файл, который включает платформу.NET, а также любые зависимости в один исполняемый файл для упрощения развертывания — это было полезно для нас..NET 6 расширяет это покрытие, позволяя создавать отдельные файлы вывода для Windows, а также для OS X.

C

C # 10 предоставляет набор улучшений языка, которые предоставляют дополнительный синтаксический сахар для уменьшения объема кода и улучшения возможности выражения. К сожалению, пара ключевых улучшений, которые я надеялся увидеть ( проверка нулевых параметров и обязательные параметры ), не помогла, но должна появиться в C # 11.

Посмотрим, что у нас получилось:

Неявное использование, глобальное использование и объявление пространства имен с файловой областью

Hello World в C # теперь занимает всего одну строку:

Console.WriteLine("Hello World").

Раньше вам нужно было обернуть его по крайней мере в метод под названием Main, который мог бы действовать как точка входа для программы, а также как класс. Чтобы избежать полной квалификации методов, мы обычно вводим в область видимости System с помощью оператора using.

В C # 10 внесено несколько изменений, которые помогают удалить часть этого шаблонного кода. Во-первых, неявное использование — это удобство компилятора, где пространства имен, которые вам нужно импортировать, помогают идентифицировать и ограничивать область видимости. Я сам более многословный разработчик, поэтому предпочитаю точно понимать, как что-то было ограничено. Так что лично я вижу больше преимуществ в одном из других улучшений C # 10: возможность импорта в глобальной области, избегая необходимости включать использование определений для каждого файла.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

Теперь у нас может быть один файл, содержащий следующие объявленные глобальные использования, и все остальные файлы автоматически имеют те, которые доступны в области видимости:

global using System;
global using System.Collections.Generic;
global using System.Linq;
global using System.Text;
global using System.Threading.Tasks;

Говоря о пространствах имен, последнее небольшое улучшение, которое поможет уменьшить отступы в вашем коде, — это объявление пространства имен с файловой областью. Пространства имен являются стандартным механизмом определения области видимости в.NET, но стандартный способ включает перенос связанного кода в область видимости пространства имен и соответствующий отступ. Теперь мы можем взять это:

namespace MyNextBigApplication
{
  internal class Token
  {
	public Token(string code) => Code = code;
	public static DateTime ClaimTime => DateTime.Now;
	public string Code { get; }
  }
}

и вместо этого объявите пространство имен как одну строку в верхней части файла, а затем остальная часть файла будет помещена в это пространство имен:

namespace MyNextBigApplication;

internal class Token
{
  public Token(string code) => Code = code;
  public static DateTime ClaimTime => DateTime.Now;
  public string Code { get; }
}

Для большинства файлов, которые всегда находятся только в одной области пространства имен, это помогает удалить несчетное количество пробелов (или табуляций).

Читайте также:  Создавайте успешные приложения React Native с Raygun

Улучшения лямбда-выражений

Лямбда-выражения были ключевой функцией языка C # со времен.NET 3, а C # 10 предоставляет некоторые дополнительные тонкости.

Теперь вы можете напрямую указать тип возвращаемого значения Lambda, а не выводить его, что обеспечивает квалификацию, помогающую разрешить ситуации с перегруженным методом или правильно определить область возвращаемого типа.

Учтите следующее:

var result = (string s) => 1;

Предполагается, что возвращаемый тип — Int32. Однако, если бы мы хотели вернуть Int16, мы могли бы сделать:

var result = (string s) => (short)1.

Или теперь мы можем явно определить тип возвращаемого значения, что помогает при проверке времени компиляции и позволяет избежать ошибок приведения во время выполнения:

var result = short (string s) => 1;

Неявное разрешение также было улучшено.

Второе улучшение немного более спорно, поскольку фактическая читаемость на нем не является улучшением. Однако функциональное улучшение компенсирует это и обеспечивает паритет между анонимными лямбда-функциями и стандартными методами применения атрибутов:

var lambda = [Example(123)] (string s) => 1;

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

[HttpPost("/")] Alert CreateAlert(Alert a) => { do-stuff(); return a; };

Атрибуты также могут применяться к параметрам, хотя мне это кажется более узким делом.

Структуры записи

В C # 9 мы получили доступ к новому ссылочному типу — записи, а также неизменяемым свойствам (через init ). В C # 10 это теперь распространяется и на структуры. Использование записей по сравнению со стандартными классами или структурами дает два ключевых преимущества: обеспечение проверки равенства между экземплярами на основе значений и поддержка неизменяемых структур.

Чтобы объявить структуру как запись, вы указываете:

public record struct Foo {}

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

public record class Foo {}

в отличие от

public record Foo {}

Как и в случае с записями на основе классов, вы также можете использовать выражения with для быстрого клонирования существующей записи и внесения определенных изменений.

public record struct Foo {}

Использование подхода с неизменяемой записью обеспечивает очень сильный прирост производительности по сравнению со стандартными изменяемыми структурами, и его следует учитывать при оптимизации производительности.

Заключение

Вот и все — довольно солидный набор обновлений. Если вы используете.NET Core или.NET 5, вам нужно будет взглянуть на обновление, и путь миграции будет довольно минимальным. Visual Studio 2022 также вышел сегодня и, наконец, дает нам 64-разрядную версию Visual Studio, а также собственный набор преимуществ производительности для повышения вашей продуктивности. Если вы используете Raygun, вы обнаружите, что наш поставщик отчетов о сбоях уже настроен для.NET 6, и мы находимся в процессе выпуска обновленной поддержки.NET 6 для APM, наряду с поддержкой профилирования приложений.NET, развернутых в Linux.

Оцените статью
bestprogrammer.ru
Добавить комментарий

Adblock
detector