Шаблоны типов и свойств
Сопоставляйте форму и элементы объекта.
«Шаблоны типов и свойств» — бесплатный урок C# Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.
Шаблон типа
Шаблон типа соответствует значению, если оно является экземпляром заданного типа. В ветви выражения выбора он записывается просто именем типа и проверяет тип значения во время выполнения.
Это заменяет громоздкие цепочки проверок is и приведений типов одной понятной проверкой-выражением, которая заодно уточняет тип значения.
object o = "hello";
string kind = o switch
{
int => "number",
string => "text",
_ => "unknown"
};
System.Console.WriteLine(kind);Шаблоны объявления
Шаблон объявления добавляет имя переменной после типа: string s. При соответствии входное значение приводится к этому типу и связывается с указанной переменной.
Затем типизированную переменную можно использовать в правой части ветви, обращаясь к членам, характерным для этого типа, без дополнительного приведения.
object o = "coddy";
string result = o switch
{
string s => $"len {s.Length}",
int n => $"value {n}",
_ => "other"
};
System.Console.WriteLine(result);Рабочее сопоставление типов
Шаблоны типов идеально подходят для обработки неоднородных данных, например значений, разобранных из массива object.
Здесь каждый элемент сопоставляется с его типом во время выполнения и форматируется соответствующим образом. Связанная переменная передаёт уточнённый тип в выражение результата.
using System;
class Program {
static string Describe(object o) => o switch {
int i => $"int {i}",
double d => $"double {d}",
string s => $"string '{s}'",
_ => "?"
};
static void Main() {
foreach (var x in new object[]{ 1, 2.5, "hi" })
Console.WriteLine(Describe(x));
}
}Шаблон свойств
Шаблон свойств проверяет члены объекта с помощью фигурных скобок: { Property: value }. Он соответствует значению, если каждое указанное свойство соответствует вложенному шаблону.
Это позволяет напрямую выбирать ветвь по структуре и содержимому объекта, не записывая ручные сравнения его членов.
record Person(string Name, int Age);
var p = new Person("Ada", 30);
string stage = p switch
{
{ Age: < 18 } => "minor",
{ Age: >= 65 } => "senior",
_ => "adult"
};
System.Console.WriteLine(stage);Несколько свойств
Несколько свойств можно проверить одновременно, разделив их запятыми внутри фигурных скобок. Для срабатывания ветви должны соответствовать все свойства.
Так можно ясно выразить составные условия, например сопоставить объект, у которого есть определённый статус и конкретное количество элементов.
record Order(string Status, int Items);
var order = new Order("Open", 0);
string msg = order switch
{
{ Status: "Open", Items: 0 } => "empty cart",
{ Status: "Open" } => "shopping",
_ => "closed"
};
System.Console.WriteLine(msg);Сочетание типа и свойств
Шаблоны типов и свойств можно сочетать: сначала укажите тип, затем блок свойств в фигурных скобках. Ветвь соответствует значению только тогда, когда оно имеет этот тип и его свойства соответствуют шаблону.
Это особенно полезно при работе со ссылками на базовый класс или интерфейсами, когда нужно одновременно выбирать ветвь по конкретным производным типам и их состоянию.
using System;
abstract record Shape;
record Circle(double R) : Shape;
record Square(double Side) : Shape;
class Program {
static string Big(Shape s) => s switch {
Circle { R: > 10 } => "big circle",
Square { Side: > 10 } => "big square",
_ => "small"
};
static void Main() => Console.WriteLine(Big(new Circle(12)));
}Вложенные шаблоны свойств
Шаблоны свойств могут быть вложенными. Если свойство само является объектом, его члены сопоставляются с помощью ещё одного блока в фигурных скобках.
Например, { Address: { City: "Paris" } } за одно выражение углубляется на два уровня. Это позволяет избежать цепочек доступа через точки, в которых возможны обращения к отсутствующим значениям.
record Address(string City);
record User(string Name, Address Address);
var u = new User("Lin", new Address("Paris"));
bool inParis = u is { Address: { City: "Paris" } };
System.Console.WriteLine(inParis);Расширенный доступ к свойствам
Начиная с C# 10 внутри шаблона свойств можно использовать путь через точки: { Address.City: "Paris" }. Это сокращённая запись вложенных фигурных скобок.
Так глубокие проверки превращаются в одну понятную строку, при этом промежуточные значения безопасно обрабатываются во время сопоставления.
record Address(string City);
record User(string Name, Address Address);
var u = new User("Lin", new Address("Rome"));
string where = u switch
{
{ Address.City: "Paris" } => "FR",
{ Address.City: "Rome" } => "IT",
_ => "??"
};
System.Console.WriteLine(where);Сохранение всего соответствия
Переменную можно связать со всем соответствующим значением, добавив имя после шаблона свойств: { Age: > 18 } adult.
Затем переменная adult ссылается на весь объект внутри ветви, позволяя использовать его после проверки свойств.
using System;
record Person(string Name, int Age);
class Program {
static void Main() {
Person p = new("Sam", 40);
string r = p switch {
{ Age: >= 18 } adult => $"{adult.Name} can vote",
_ => "too young"
};
Console.WriteLine(r);
}
}Обработка отсутствующих значений
Шаблон свойств никогда не соответствует null, поскольку проверять нечего. Поэтому { } с пустыми фигурными скобками соответствует любому ненулевому значению.
Это делает not null и { } удобными выражениями для проверки отсутствующих значений и гарантирует, что ветви на основе свойств безопасно пропускают такие входные значения.
string? maybe = null;
string state = maybe switch
{
null => "missing",
{ Length: 0 } => "empty",
_ => "has text"
};
System.Console.WriteLine(state);Почему шаблоны лучше приведений типов
До появления шаблонов ветвление по типу означало проверки is, за которыми следовали приведения типов и проверки отсутствующих значений. Шаблоны типов и свойств объединяют всё это в одном выражении.
Компилятор также отслеживает полноту и достижимость, обнаруживая недостижимые ветви и пропущенные случаи, которые самостоятельно написанные цепочки условных операторов могли бы молча проигнорировать.
object o = 42;
// Old: if (o is int) { int n = (int)o; ... }
// New:
if (o is int n) System.Console.WriteLine(n + 1);Быстрая проверка
Проверьте, насколько Вы понимаете шаблоны типов и свойств.
Итоги
Шаблоны типов сопоставляют значения по типу во время выполнения и могут связывать типизированную переменную. Шаблоны свойств проверяют члены с помощью конструкции { Prop: pattern }, поддерживают вложенные структуры и пути через точки и никогда не соответствуют значению null.
Сочетайте их, чтобы выбирать ветвь по структуре и состоянию. Далее рассматриваются реляционные и логические шаблоны.
Часто задаваемые вопросы
Урок «Шаблоны типов и свойств» бесплатный?
Да — полный текст урока «Шаблоны типов и свойств» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.
Чему я научусь в уроке «Шаблоны типов и свойств»?
Сопоставляйте форму и элементы объекта. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C# Academy?
Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Шаблоны типов и свойств»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C# Academy?
Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Выражения switch
- Шаблоны типов и свойств
- Реляционные и логические шаблоны
- Шаблоны списков и кортежей