Полное руководство по языку программирования С# 14 и платформе .NET 10 / Pattern matching

Позиционный паттерн

Начальный ⏱ 2 мин чтения 👁 2 🕓 обновлено 11.08.2026

Позиционный паттерн применяется к типу, у которого определен метод деконструктора. Например, определим следующий класс:


class MessageDetails
{
    public string Language { get; set; } = "";    // язык пользователя
    public string DateTime { get; set; } = "";    // время суток
    public string Status { get; set; } = "";     // статус пользователя

    public void Deconstruct(out string lang, out string datetime, out string status)
    {
        lang = Language;
        datetime = DateTime;
        status = Status;
    }
}

Теперь используем позиционный паттерн и в зависимости от значений объекта MessageDetails возвратим определенное сообщение:


string GetWelcome(MessageDetails details) => details switch
{
	("english", "morning", _) => "Good morning",
	("english", "evening", _) => "Good evening",
	("german", "morning", _) => "Guten Morgen",
	("german", "evening", _) => "Guten Abend",
	(_, _, "admin") => "Hello, Admin",
	_ => "Здрасьть"
};

Фактически этот паттерн похож на пример с кортежами выше, только теперь вместо кортежа в конструкцию switch передается объект MessageDetails. Через метод деконструктора мы можем получить набор выходных параметров в виде кортежа и опять же по позиции сравнивать их с некоторыми значениями в конструкции switch.

Применение:


MessageDetails details1 = new MessageDetails { Language = "english", DateTime = "evening", Status = "user" };
string message = GetWelcome(details1);
Console.WriteLine(message);  // Good evening

MessageDetails details2 = new MessageDetails { Language = "french", DateTime = "morning", Status = "admin" };
message = GetWelcome(details2);
Console.WriteLine(message);  // Hello, Admin

Также мы можем взять значения объекта MessageDetails и использовать их при создании результата метода:


string GetWelcome(MessageDetails details) => details switch
{
	("english", "morning", _) => "Good morning",
	("english", "evening", _) => "Good evening",
	("german", "morning", _) => "Guten Morgen",
	("german", "evening", _) => "Guten Abend",
	(_, _, "admin") => "Hello, Admin",
	(var lang, var datetime, var status) => $"{lang} not found, {datetime} unknown, {status} undefined",
	_ => "Здрасьть"
};

В предпоследней инструкции в конструкции switch получаем по позиции значения из MessageDetails в переменные lang, datetime и status и используем их для создания сообщения:


MessageDetails details1 = new MessageDetails 
{ 
    Language = "chinese", 
    DateTime = "night", 
    Status = "moderator" 
};
string message = GetWelcome(details1);
Console.WriteLine(message);  // chinese not found, night unknown, moderator undefined

Проверь себя

📋 Тест по теме «Позиционный паттерн» Тест по теме

Практические задания

Лёгкое Ручная проверка Заполните пропуск в коде (1)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

class _____
{
    public string Language { get; set; } = "";    // язык пользователя
    public string DateTime { get; set; } = "";    // время суток
    public string Status { get; set; } = "";     // статус пользователя

    public void Deconstruct(out string lang, out string datetime, out string status)
    {
        lang = Language;
        datetime = DateTime;
        status = Status;
    }
}
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (2)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

string GetWelcome(_____ details) => details switch
{
	("english", "morning", _) => "Good morning",
	("english", "evening", _) => "Good evening",
	("german", "morning", _) => "Guten Morgen",
	("german", "evening", _) => "Guten Abend",
	(_, _, "admin") => "Hello, Admin",
	_ => "Здрасьть"
};
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (3)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

MessageDetails details1 = _____ MessageDetails { Language = "english", DateTime = "evening", Status = "user" };
string message = GetWelcome(details1);
Console.WriteLine(message);  // Good evening

MessageDetails details2 = new MessageDetails { Language = "french", DateTime = "morning", Status = "admin" };
message = GetWelcome(details2);
Console.WriteLine(message);  // Hello, Admin
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (4)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

string GetWelcome(MessageDetails _____) => details switch
{
	("english", "morning", _) => "Good morning",
	("english", "evening", _) => "Good evening",
	("german", "morning", _) => "Guten Morgen",
	("german", "evening", _) => "Guten Abend",
	(_, _, "admin") => "Hello, Admin",
	(var lang, var datetime, var status) => $"{lang} not found, {datetime} unknown, {status} undefined",
	_ => "Здрасьть"
};
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (5)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

MessageDetails details1 = new MessageDetails 
{ 
    _____ = "chinese", 
    DateTime = "night", 
    Status = "moderator" 
};
string message = GetWelcome(details1);
Console.WriteLine(message);  // chinese not found, night unknown, moderator undefined
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (1)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

class MessageDetails
{
    public string Language { get; set; } = "";    // язык пользователя
    public string DateTime { get; set; } = "";    // время суток
    public string Status { get; set; } = "";     // статус пользователя

    public void _____(out string _____, out string datetime, out string status)
    {
        lang = Language;
        datetime = DateTime;
        status = Status;
    }
}
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (2)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

string GetWelcome(MessageDetails details) => details switch
{
	("english", "morning", _) => "Good morning",
	("english", "evening", _) => "Good evening",
	("german", "morning", _) => "_____ Morgen",
	("german", "evening", _) => "Guten Abend",
	(_, _, "admin") => "_____, Admin",
	_ => "Здрасьть"
};
Войдите, чтобы отправить решение
Среднее Ручная проверка Расставьте строки кода в правильном порядке
+20 XP

Строки кода из примера этого урока перемешаны. Впишите их в правильном порядке, каждую строку — с новой строки.

MessageDetails details1 = new MessageDetails { Language = "english", DateTime = "evening", Status = "user" };
Console.WriteLine(message);  // Hello, Admin
Console.WriteLine(message);  // Good evening
message = GetWelcome(details2);
MessageDetails details2 = new MessageDetails { Language = "french", DateTime = "morning", Status = "admin" };
string message = GetWelcome(details1);
Войдите, чтобы отправить решение
Сложное Ручная проверка Объясните и модифицируйте пример из урока «Позиционный паттерн»
+30 XP

Опишите своими словами, что делает приведённый пример кода из урока «Позиционный паттерн», и предложите одно осмысленное изменение (например, другое входное значение или дополнительное условие). Приведите итоговый код.

class MessageDetails
{
    public string Language { get; set; } = "";    // язык пользователя
    public string DateTime { get; set; } = "";    // время суток
    public string Status { get; set; } = "";     // статус пользователя

    public void Deconstruct(out string lang, out string datetime, out string status)
    {
        lang = Language;
        datetime = DateTime;
        status = Status;
    }
}
Войдите, чтобы отправить решение
Сложное Ручная проверка Найдите потенциальную проблему в коде урока «Позиционный паттерн»
+30 XP

Изучите приведённый фрагмент кода и опишите, при каких входных данных или условиях он может сработать не так, как ожидается (граничный случай, отсутствие проверки и т.п.). Предложите исправленный вариант.

string GetWelcome(MessageDetails details) => details switch
{
	("english", "morning", _) => "Good morning",
	("english", "evening", _) => "Good evening",
	("german", "morning", _) => "Guten Morgen",
	("german", "evening", _) => "Guten Abend",
	(_, _, "admin") => "Hello, Admin",
	_ => "Здрасьть"
};
Войдите, чтобы отправить решение
Мини-проект Ручная проверка Мини-проект по теме «Позиционный паттерн»
+50 XP

Соберите небольшую программу, которая последовательно демонстрирует ключевые идеи урока. Программа должна быть рабочей и содержать минимум два самостоятельно написанных фрагмента, а не просто копию примера из урока.

Войдите, чтобы отправить решение
Домашнее задание Ручная проверка Домашнее задание по теме «Позиционный паттерн»
+25 XP

Напишите собственную небольшую программу, применяющую материал темы «Позиционный паттерн». Используйте не менее одной конструкции, показанной в примерах урока. Прикрепите код решения и краткое описание того, что он делает.

Войдите, чтобы отправить решение

Обсуждение (0)

Войдите, чтобы оставить комментарий.