0Pricing
C# Academy · Урок

Шаблоны типов и свойств

Сопоставляйте форму и элементы объекта.

«Шаблоны типов и свойств» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Выражения switch
  2. Шаблоны типов и свойств
  3. Реляционные и логические шаблоны
  4. Шаблоны списков и кортежей
← Назад к C# Academy