TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.74K subscribers
Post #61 592
День сорок девятый. #ЗаметкиНаПолях
Деконструкция
Начиная с C# 7.0, вы можете извлекать несколько элементов из кортежа или несколько значений полей, свойств из объекта в одной операции деконструкции. При этом вы присваиваете значения полей кортежа или членов объекта отдельным переменным.

Деконструкция кортежа
Синтаксис деконструкции кортежа похож на синтаксис его определения (см. день сорок шестой). Допустим, есть метод QueryCityData, возвращающий для заданного города название, численность населения и площадь города.
Есть три варианта деконструкции:
1. Явно определить типы переменных
(string city, int population, double area) = QueryCityData("New York City");

2. Использовать ключевое слово var вне скобок для всех переменных:
var (city, population, area) = QueryCityData("New York City");

3. Использовать var любой или всех переменных:
(string city, var population, var area) = QueryCityData("New York City");

Этот метод использовать не рекомендуется.
Кроме этого, вы можете использовать уже ранее объявленные переменные:
string city = "Raleigh";
int population = 458880;
double area = 144.8;
(city, population, area) = QueryCityData("New York City");

Заметьте:
- вы не можете объявить определённый тип вне скобок, даже если все поля кортежа одного типа;
- вы обязаны присвоить каждое поле массива переменной;
- вы не можете смешивать объявления переменных с использованием ранее объявленных переменных.
Если значения каких-либо полей кортежа вам не нужны, вы можете использовать специальный символ пустой переменной "_". Например, если из примера выше нам нужно получить только население города:
var (_, population, _) = QueryCityData("New York City");

Деконструкция пользовательских типов
Некортежные типы не предлагают встроенной поддержки деконструкции. Но автор класса, структуры или интерфейса может позволить производить деконструкцию экземпляров класса, реализовав метод Deconstruct. Метод должен возвращать void, а каждое значение для деконструкции должно быть обозначено ключевым словом out. Например, следующий метод Deconstruct класса Person возвращает имя, отчество и фамилию:
public void Deconstruct(out string fname, out string mname, out string lname)

Произвести деконструкцию экземпляра класса Person, присвоенного переменной p, можно следующим образом:
var (fName, mName, lName) = p;

Можно перегружать методы Deconstruct для вызова разного количества и разных комбинаций свойств. Однако, нужно быть осторожным, определяя методы Deconstruct, с уникальными и однозначными сигнатурами. Несколько методов Deconstruct, имеющие одинаковое количество параметров, но разные типы или разный порядок параметров допустимы, но могут приводить к путанице.
При деконструкции экземпляров, так же, как и для кортежей, можно использовать пустые переменные.
Если вы не являетесь автором класса, вы можете производить деконструкцию экземпляров этого класса, реализовав один или несколько методов Deconstruct в качестве методов расширения.

Источник: https://docs.microsoft.com/ru-ru/dotnet/csharp/deconstruct
  • 👍 1
More from @netdeveloperdiary
  1. Sep 26, 2026День 2796. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Продолжение Начало Три…
  2. Sep 25, 2026День 2795. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Начало Проблема с позиц…
  3. Sep 24, 2026День 2794. #Оффтоп #Здоровье Сегодня будет необычный пост. Завтра в Москве стартует конфер…
  4. Sep 23, 2026День 2793. #ЗаметкиНаПолях #SQL 10 Редких Возможностей SQL, Которые Стоит Знать Каждому. Ч…
  5. Sep 22, 2026День 2792. #ЗаметкиНаПолях #SQL 10 Редких Возможностей SQL, Которые Стоит Знать Каждому. Ч…
  6. Sep 21, 2026🔍Тестовое собеседование с Senior C# разработчиком уже завтра 22 сентября(уже завтра!) в 1…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →