0Pricing
C# Academy · Урок

Декомпозиция

Распаковывайте кортежи в отдельные переменные.

«Декомпозиция» — бесплатный урок C# Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.

Что такое деструктуризация

Деструктуризация разбивает кортеж или объект на отдельные переменные одним оператором, позволяя сразу дать имя каждой части.

using System;

class Program
{
    static void Main()
    {
        var point = (3, 4);
        (int x, int y) = point;
        Console.WriteLine("x=" + x + ", y=" + y);
    }
}

Деструктуризация кортежа

Поместите целевые переменные в круглые скобки слева от =. Каждая переменная получит соответствующий элемент кортежа.

using System;

class Program
{
    static void Main()
    {
        var user = ("Ada", 36);
        (string name, int age) = user;
        Console.WriteLine(name + " is " + age);
    }
}

Использование var при деструктуризации

Можно позволить компилятору вывести типы с помощью var — отдельно для каждой переменной или сразу для всей группы.

using System;

class Program
{
    static void Main()
    {
        var data = (1, "one", true);
        var (id, word, flag) = data;
        Console.WriteLine(id + " " + word + " " + flag);
    }
}

Деструктуризация результата метода

Возвращаемый методом кортеж можно сразу деструктурировать в именованные переменные.

using System;

class Program
{
    static (int, int) MinMax(int a, int b) => a < b ? (a, b) : (b, a);

    static void Main()
    {
        var (lo, hi) = MinMax(8, 3);
        Console.WriteLine("min=" + lo + ", max=" + hi);
    }
}

Отбрасывание значений

Используйте символ подчёркивания _, чтобы при деструктуризации проигнорировать ненужные части.

using System;

class Program
{
    static (int, int, int) Rgb() => (255, 128, 0);

    static void Main()
    {
        var (r, _, _) = Rgb();
        Console.WriteLine("Red channel: " + r);
    }
}

Деструктуризация в уже существующие переменные

Можно присвоить значения уже объявленным переменным, не указывая имена типов.

using System;

class Program
{
    static void Main()
    {
        int a = 0, b = 0;
        (a, b) = (10, 20);
        Console.WriteLine(a + ", " + b);
    }
}

Обмен значениями с помощью кортежей

Удобный приём: обменяйте значения двух переменных в одной строке с помощью деструктуризации кортежа — временная переменная не нужна.

using System;

class Program
{
    static void Main()
    {
        int x = 1, y = 2;
        (x, y) = (y, x);
        Console.WriteLine("x=" + x + ", y=" + y);
    }
}

Метод для деструктуризации

Ваши собственные классы могут поддерживать деструктуризацию, если определить метод Deconstruct с параметрами out.

using System;

class Point
{
    public int X, Y;
    public Point(int x, int y) { X = x; Y = y; }

    public void Deconstruct(out int x, out int y)
    {
        x = X;
        y = Y;
    }
}

class Program
{
    static void Main()
    {
        var p = new Point(5, 9);
        var (px, py) = p;
        Console.WriteLine(px + ", " + py);
    }
}

Несколько перегрузок деструктуризации

Класс может предоставлять несколько перегрузок Deconstruct, возвращающих разное количество значений.

using System;

class Person
{
    public string Name; public int Age; public string City;
    public Person(string n, int a, string c) { Name = n; Age = a; City = c; }

    public void Deconstruct(out string name, out int age)
    {
        name = Name; age = Age;
    }
}

class Program
{
    static void Main()
    {
        var p = new Person("Ada", 36, "London");
        var (name, age) = p;
        Console.WriteLine(name + ", " + age);
    }
}

Деструктуризация в цикле

При переборе коллекции кортежей можно деструктурировать каждый элемент непосредственно в заголовке foreach.

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var pairs = new List<(string, int)>
        {
            ("Ann", 30),
            ("Bob", 25)
        };
        foreach (var (name, age) in pairs)
            Console.WriteLine(name + " is " + age);
    }
}

Собираем всё вместе

Деструктуризация делает код, возвращающий или хранящий несколько значений, более понятным: каждая часть получает имя непосредственно в месте использования.

using System;

class Program
{
    static (int Quotient, int Remainder) Divide(int a, int b) => (a / b, a % b);

    static void Main()
    {
        var (q, r) = Divide(17, 5);
        Console.WriteLine("17 / 5 = " + q + " remainder " + r);
    }
}

Быстрая проверка

Проверьте, насколько хорошо вы понимаете деструктуризацию.

Итоги

Деструктуризация разбивает кортеж или объект на именованные переменные одним оператором. Используйте var (a, b) = ..., отбрасывайте ненужные части с помощью _, меняйте переменные местами и выполняйте деструктуризацию в foreach. Пользовательские классы подключают эту возможность с помощью метода Deconstruct с параметрами out; при необходимости метод можно перегружать.

using System;

class Program
{
    static void Main()
    {
        var (a, b, c) = (1, 2, 3);
        Console.WriteLine(a + b + c);
    }
}

Часто задаваемые вопросы

Урок «Декомпозиция» бесплатный?

Да — полный текст урока «Декомпозиция» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.

Чему я научусь в уроке «Декомпозиция»?

Распаковывайте кортежи в отдельные переменные. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C# Academy?

Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Декомпозиция»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C# Academy?

Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

  1. Основы кортежей значений
  2. Именованные элементы кортежей
  3. Декомпозиция
  4. Кортежи как возвращаемые значения методов
← Назад к C# Academy