Разбираем Сопоставления по Шаблону в C#. Часть 1/5
Сопоставление по шаблону позволяет проверить, имеет ли выражение определённую форму (тип, значение, структуру) и сразу извлечь из него данные. В последних версиях C# сопоставление по шаблону получило много изменений, и стало легко неправильно его использовать, поэтому разберём, когда его следует применять, а когда лучше нет.
TL;DR
Кратко рассмотрим последние появившиеся шаблоны и когда их использовать:
C#7+
1. Null -
x is null – нужна проверка на null, избегая перегруженных операторов.2. Константа -
code is 404 - для сравнения значения с константой.3. Тип/объявление -
shape is Circle c - для неродственных типов.4. Отброс/var -
_ => … - ветка «по умолчанию» в switch, либо как заместитель в других шаблонах.C#8+
5. Выражение switch -
x switch { … } - нужно значение из switch с исчерпывающей проверкой.6. Шаблоны свойств -
{ Age: >= 18 } - решение зависит от свойства объекта.7. Позиционные шаблоны -
(var x, var y) - целевой тип имеет деконструктор или это запись.8. Кортежи -
(a, b) switch { … } - решение зависит от комбинации входных данных.C#9+
9. Логические и, или, не -
is not null - для композиции шаблонов без повтора переменной.10. Относительные шаблоны -
is >= 100 - проверка на числовые диапазоны.C#10+
11. Расширенные шаблоны свойств -
{ Address.City: "Paris" } - сопоставление со вложенными свойствами без вложенных скобок.C#11+
12. Список/срез -
arr is [1, .., 9] - шаблоны для небольших последовательностей.Что такое сопоставление по шаблону в C#?
Это языковая функция, которая проверяет, имеет ли выражение определённую форму — тип, константу или структуру — и, в случае совпадения, извлекает его данные в типизированные переменные.
Шаблон — описание того, как должно выглядеть выражение. Сопоставление — проверка выражения на соответствие этому описанию. Результатом является логическое значение (булево значение), и в случае успешного совпадения язык также может извлекать данные в типизированные переменные.
По сравнению с длинными цепочками операторов
if, сопоставление с образцом даёт 3 важных преимущества:- Проверяемое выражение используется один раз, а не несколько.
- Проверки типов предоставляют найденное значение как типизированную переменную. Никаких приведений типов.
- Выражения
switch обнаруживают пропущенные случаи во время компиляции.Оба фрагмента кода ниже выполняют одну и ту же работу. Второй вариант сочетает в себе шаблоны типа и свойства, и разницу в читаемости трудно оспорить:
// Традиционный оператор if с несколькими условиями и приведением типов
if (person != null && person.Age >= 18 && person is Employee
&& ((Employee)person).YearsAtCompany > 5)
…
// Аналогичное сопоставление по шаблону
if (person is Employee { Age: >= 18, YearsAtCompany: > 5 })
…
Шаблоны используются в трех местах:
- оператор
is,- классический оператор
switch,- выражение
switch, появившееся в C# 8.Продолжение следует…
Источник: https://blog.ndepend.com/c-pattern-matching-explained/