Posted on 7. October 2021

Подборка паттернов С# 9

 

В предыдущей статье серии статей о C # 9 были рассмотрены программы верхнего уровня и целевые типизированные выражения. В этой статье расскажем о новых функциях сопоставления с образцом. Вы можете найти обзор синтаксиса, предлагаемого предыдущими версиями C# в сопоставлении с паттернами C# 8.

Виды паттернов

При проверке на соответствие типу предыдущие версии C# требовали, чтобы вы указали имя переменной (или  _ discard). В C# 9 это больше не требуется:

// is pattern with Type

if (input is Person)

...

 

// case pattern with Type

switch (input)

{

  case Person:

    ... 

 

// is pattern with tuple Type

if (input is (int, string))

...

 

Объединение паттернов

С выражением is в более ранних версиях C # вы уже могли комбинировать шаблоны с помощью обычных логических операторов:

if (person is Student || person is Teacher)
...

 

Однако это не работает для выражений switch и меток switch case. В C# 9 добавлена поддержка комбинирования шаблонов с использованием ключевых слов and и or, что работает как для if, так и для switch:

if (person is Student or Teacher)
...
 
decimal discount = person switch
{
   Student or Teacher => 0.1m,
   _ => 0
};
 
switch (person)
{
   case Student or Teacher:
      ...

 Паттерны and имеют более высокий приоритет, чем or. Вы можете добавить круглые скобки, чтобы изменить или уточнить приоритет.

Преобразование паттернов

В C# 9 вы можете инвертировать паттерны с помощью ключевого слова not:

if (person is not Student)
...
 
switch (person)
{
  case not Student:
    ...

 

Интересный случай - is not null паттерн. Это проверит, не является ли ссылка нулевой. Использование != null может проверить что-то другое, когда тип перегружает оператор  !=.

if (person is not null)
...

 

Реляционные паттерны

Реляционные паттерны позволяют сравнивать выражение с постоянным числовым значением:

decimal discount = age switch
{
   <= 2 => 1,
   < 6  => 0.5m,
   < 10 => 0.2m,
   _    => 0
};

 

Паттерны внутри паттернов

Паттерны также могут содержать другие паттерны. Такое вложение позволяет кратко и понятно описывать сложные условия. В следующем примере объединены несколько типов паттернов:

if (person is Student { Age : >20 and <30 })
...

 

Заключение

В этой статье мы рассмотрели новые функции сопоставления с образцом в C# 9. Дополнения позволяют выражать более сложные условия с помощью четкого и лаконичного синтаксиса.

В следующей статье будут рассмотрены новые возможности для методов и функций в C # 9.

C# 9 можно использовать с .NET 5 SDK, который доступен в Red Hat Enterprise Linux и Red Hat OpenShift, в Fedora, а также в Microsoft для Windows, macOS и других дистрибутивах Linux.

 

Источник



Comments are closed