День сорок девятый. #ЗаметкиНаПолях
Деконструкция
Начиная с C# 7.0, вы можете извлекать несколько элементов из кортежа или несколько значений полей, свойств из объекта в одной операции деконструкции. При этом вы присваиваете значения полей кортежа или членов объекта отдельным переменным.
Деконструкция кортежа
Синтаксис деконструкции кортежа похож на синтаксис его определения (см. день сорок шестой). Допустим, есть метод
Есть три варианта деконструкции:
1. Явно определить типы переменных
Кроме этого, вы можете использовать уже ранее объявленные переменные:
- вы не можете объявить определённый тип вне скобок, даже если все поля кортежа одного типа;
- вы обязаны присвоить каждое поле массива переменной;
- вы не можете смешивать объявления переменных с использованием ранее объявленных переменных.
Если значения каких-либо полей кортежа вам не нужны, вы можете использовать специальный символ пустой переменной "
Некортежные типы не предлагают встроенной поддержки деконструкции. Но автор класса, структуры или интерфейса может позволить производить деконструкцию экземпляров класса, реализовав метод
При деконструкции экземпляров, так же, как и для кортежей, можно использовать пустые переменные.
Если вы не являетесь автором класса, вы можете производить деконструкцию экземпляров этого класса, реализовав один или несколько методов
Источник: https://docs.microsoft.com/ru-ru/dotnet/csharp/deconstruct
Деконструкция
Начиная с 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