25 марта 2019
Возможности C#
В восьмой версии 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.