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

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

Начиная с C# 8.0, специально предназначенного для .NET Core, было добавлено выражение switch, которое может запутать, если вы не сможете отличить его от оператора switch.
Сегодня я попытаюсь объяснить здесь, что такое switch выражение есть, но для этого мы начнем с краткого обновления оператора switch.

Давайте быстро рассмотрим оператор switch

Оператор switch позволяет вам определить, какие операторы будут выполняться на основе шаблона условия, соответствующего оцениваемому элементу.

В этом простом примере на основе кода города мы показываем ставку транспортных расходов.

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

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

В приведенном выше примере тариф для городов с кодом 0 и 1 одинаков, поэтому мы можем его сгруппировать.

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

А начиная с версии 7.0 C# мы можем использовать разные типы шаблонов для каждого случая. Например, «постоянный шаблон» для строк или фиксированных значений, как в предыдущих примерах, или «реляционный шаблон», когда вам нужно оценить условия или сравнить значения, как мы увидим далее.

В этом смысле еще одним интересным паттерном является «шаблон свойства», который позволяет выполнять оценку на основе значения свойства объекта.
Давайте еще раз отредактируем один из методов, но теперь применим паттерн свойства.

Как видите, в данном случае мы оцениваем кейсы на основе свойства «Код» объекта «город» класса «Город».

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

Теперь давайте перейдем к выражению switch

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

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

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

В его структуре мы видим, что: (1) Выражение начинается с оцениваемого элемента, выражения или переменной, а не со слова switch. (2); с другой стороны, и сравнивая его с оператором switch, мы могли бы сказать, что слова case не существует, указан только образец, а две точки case: «были изменены» на «=›», что делает код более интуитивен; (3) «По умолчанию» было удалено с помощью символа отбрасывания «_»; и (4) разрыва нет, и одно условие отделяется от другого одной запятой «,».

Что касается шаблонов сравнения, принимаемых выражением switch, то они такие же, как и шаблоны, принимаемые оператором switch.

Давайте посмотрим на простой пример в действии.

При этом мы можем увидеть следующее:

  • Получаем в качестве параметра код города
  • мы применяем выражение переключения в этом случае к переменной города, нашему входному параметру. В этом случае применяется один шаблон, который является постоянным шаблоном, что позволяет вычислять выражение с фиксированным значением.
  • Выражение switch вернет значение, в данном случае строку, которая будет присвоена переменной «результат», и ее значение будет зависеть от того, соответствует ли значение переменной города во время выполнения одному из указанных шаблонов или без, и в этом случае возвращается значение, указанное по умолчанию «_».

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

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

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

Примечание: представленные коды имеют базовый вид, чтобы иметь возможность создавать простые примеры и быть понятными читателю.