C# 8 – Новое выражение switch

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

Формат записи выглядит следующим образом:

var [result] = [source] switch 
{
    [pattern 1] (var 1) (when [conditions]) => [expression 1],
    [pattern 2] (var 2) (when [conditions]) => [expression 2],
    …    
    [pattern N] (var N) (when [conditions]) => [expression N]
}

, где:

  • Обязательные параметры:
    • result – переменная, в которую будет записан результат.
    • source – переменная, которая будет сопоставлена с образцами.
    • pattern 1pattern N – образцы для сопоставлений.
    • expression 1expression N – выражения, которые будут выполнены при удачном сопоставлении source с соответствующим образцом. Результаты всех выражений должны быть одного типа или приводиться к одному общему типу. Именно этот тип и будет типом результата, который будет передан в result .
  • Опциональные:
    • var 1 … var N – переменная, тип которой совпадает с типом source или может быть выведен из него. В случае успешного сопоставления в неё будет присвоено значение из source. Область видимости – выражение, соответствующее образцу.
    • when [contitions] – ключевое слово when позволяет определить дополнительные условия (contitions) для выполнения соответствующего выражения.

Не стоит считать конструкцию switch/case устаревшей. Ее по прежнему можно использовать когда это необходимо.

Можно выделить следующие отличия выражения от конструкции:

  • Блок switch может вернуть значение, которым будет результат выполнения сработавшей ветки.
  • Переменная для сопоставления указывается перед ключевым словом switch.
  • Ключевое слово case отсутствует.
  • Для выполнения действий используются выражения.
  • Образец отделяется от выполняемого выражения при помощи символов "=>".
  • В качестве разделителя после выполняемого выражения применяется запятая.

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

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

Рассмотрим очень простой пример использования выражения: по заданному коду скидки необходимо получить ее размер в процентах.

var discount = customer.DiscountLevel switch {
    1 => 3,
    2 => 5,
    3 => 10,
    _ => 0
};

Стоит отметить, что образец _ используется для обработки всех значений, не соответствующих остальным образцам. Это аналог ветки default из записи в форме конструкции switch/case.

Дополнительные примеры можно найти в описании образцов для сопоставлений, появившихся в C# 8.

Добавить комментарий