Главная

C# 8.0. Новые возможности.

Новый релиз .NET Core 3.0 привнес много интересных особенностей в .NET.

Поделиться:
 

7+

Новый релиз .NET Core 3.0 привнес много интересных особенностей в .NET. Как часть нового релиза, вышла и новая версия C# — 8.0. За прошедшие годы, компании Microsoft удалось закрепить за C# статус многофункционального и универсального языка программирования. Эта позиция до сих пор укрепляется.В этой небольшой статье я расскажу о новых особенностях C# 8, а также об их практическом применении. В данной статье мы сосредоточимся исключительно на языковых особенностях.

Обнуляемые ссылочные типы.

Тони Хоар назвал null «ошибкой на миллиард долларов», и он точно не единственный, кто критикует данную языковую конструкцию. C# 8 имеет обнуляемые ссылочные типы, цель которых заключается в устранении головной боли, вызываемой постоянными NullReferenceException.

Суть обнуляемых нулевых типов состоит в четком определении в случае возможных нулевых значений. Эта новая особенность также является opt-in, что означает отсутствие проблем в поддержке кода прошлых версий. Если данный параметр включен, ссылочные типы, которые могут оказаться нулевым должны быть четко обозначены с помощью ? , аналогично обнуляемым типам значений. Любая переменная где ? не добавляется к типу, обрабатывается как необнуляемый ссылочный тип.

Компилятор использует статический анализ во время компиляции, чтобы определить, действительно ли необнуляемая ссылка не нулевая. Если он обнаружит поток, в котором значение может быть нулевым, у вас появится предупреждение. В случаях, когда компилятор выкидывает предупреждение, но вы уверены в том, что значение не является нулевым (например, когда элемент назначается посредством десериализации), вы можете переопределить это поведение с помощью оператора ! (с англ. null-forgiven operator). Например:

// Assume the compiler issues a warning for “value” here.
value!.Type;

Зачем это надо?

Цель этой языковой функции — предоставить надежный механизм, с помощью которого можно исключить NullReferenceException. Вдобавок ко всему, она(данная языковая функция) предоставляет способ, посредством которого намерениеnull может быть выражено в коде, что ранее было возможно только при использовании типов Option.

За более детальной информацией обращайтесь к документации.

Асинхронные перечислители (потоки)

Одной из весомых особенностей C# 8 являются асинхронные перечислители. Они называются IAsyncEnumerable <T>.В следующем примере объявляется производитель(producer) GenerateNumbersAsync (), который выдает целое число каждую секунду, и потребитель(consumer), который записывает число в Console.Out по мере их поступления:

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

Зачем это надо?

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

Курс “Разработчик C#” от OTUS

Выражения Switch

Выражениеswitch существует уже много лет, но по мере развития технологий потребность в языковой конструкции, которая может переключать(switch) объект по его форме (то есть по свойствам), а не только по типу CLR, становится все более очевидной.

Этот новый синтаксис switch позволит выполнять сопоставление с образцом свойств типа, например:

Эта новая конструкция позволит вам писать больше декларативных свичей(switch) и расширяет сопоставление с образцом, реализованное в C# 7.

Зачем это надо?

Несмотря на то, что C# строго типизирован и, следовательно, относительно предсказуем, объекты, полученные из вне, не обязательно соответствуют тем же правилам. При написании кода, который интегрируется с другими приложениями, у которых более гибкая компоновка объектов, возможно, в зависимости от свойства Kind, как это часто наблюдается в веб-хуках, способность обрабатывать объекты на основе их формы становится все более важной. Новый синтаксис switch позволяет писать код для обработки таких случаев гораздо более кратким.

Использование деклараций

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

К счастью, C# 8 подсластил использование данной конструкции. Вместо целого блока кода, теперь все сводится к блоку операторов, в котором он содержится.Вот пример:

Компилятор по-прежнему генерирует try{…} finally {s.Dispose (); }

Но теперь, код стал более лаконичен.

Зачем это надо?

Это простое улучшение синтаксического сахара. Также это улучшает читаемость кода, а, лично я считаю, что хороший код — это читабельный и простой код.

Индексы и Диапазон

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

Для индексации с конца массива, нужно просто добавить ^ к индексу элемента —arr[^2] (выдаст предпоследний элемент массива).

Диапазоны аналогичны методам в Span <T> .Slice (int start, int end), но теперь нет необходимости вызывать Slice, например:

Результатом является срез.

Зачем это надо?

Опять же, это все в основном просто синтаксический сахар, за исключением индексации конца массива.

Заключение

Хотя в C# не так много возможностей, как в некоторых других языках (я смотрю на вас си-плюс-плюшники), язык определенно развивается, и с каждым релизом добавляются новые, полезные функции.

Эта версия C# содержит новые, полезные конструкции, которые будут особенно полезны для тем, кто имеет дело с огромными приложениями, страдающими от NullReferenceExceptions, или для тех, кто разрабатывает микросервисную экосистему и сталкивается с большим количеством сетей и обменом сообщениями.

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

C# постоянно развивается, и если вы хотите получать предварительный просмотр предложений по следующей версии, загляните в репозиторий csharplang на GitHub!

Для получения дополнительной информации о других новинках .NET Core 3.0 обязательно ознакомьтесь с документацией.

Курс “Разработчик C#” от OTUS

7+