Новый релиз .NET Core 3.0 привнес много интересных особенностей в .NET.
Новый релиз .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
по мере их поступления:
Данную конструкцию интересно использовать при обработке входящих сообщений из очереди. Вместо того чтобы прописывать огромный код для обработки, вы просто обрабатываете все в теле цикла.
Наличие асинхронных потоков дает нам очень надежный механизм для реализации шаблонов производителя/ потребителя, например, при обработке входящих сообщений из очереди. Теперь можно просто ждать каждый поток сообщений и напрямую передавать сообщения соответствующим обработчикам.
Выражение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 обязательно ознакомьтесь с документацией.