Декомпозиция
Распаковывайте кортежи в отдельные переменные.
«Декомпозиция» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Основы кортежей значений
- Именованные элементы кортежей
- Декомпозиция
- Кортежи как возвращаемые значения методов