C# 8 – Новое выражение switch
В восьмой версии 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 1…pattern N– образцы для сопоставлений.expression 1…expression 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.