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

const location = { latitude: 52.5141156, longitude: 13.2857691 };

// deconstructing
const { latitude, longitude } = location; 

Кортежи в C#

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

Метод GetLocation возвращает кортеж на основе переданного города. После этого мы деконструируем его, присваивая возвращаемое значение вызова метода.

private static (double latitude, double longitude) GetLocation(string city)
{
    if (city == "Berlin")
        return (52.5141156, 13.2857691);
    
    return (0, 0);
}

// ...

// deconstruct tuple
(double latitude, double longitude) = GetLocation("Berlin");
Console.WriteLine($"lat: {latitude}, long: {longitude}"); // lat: 52.5141156, long: 13.2857691

Пользовательские типы

Мы можем деконструировать не только кортежи, но и определяемые пользователем типы с помощью C#. Для этого нам нужно реализовать метод Deconstruct, как показано ниже.

public class Location
{
    public double Latitude { get; set; }
    public double Longitude { get; set; }
    
    public void Deconstruct(out double latitude, out double longitude)
    {
        latitude = Latitude;
        longitude = Longitude;
    }
}

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

var location = new Location
{
    Latitude = 52.5141156,
    Longitude = 13.2857691
};

// deconstruct object
(double latitude, double longitude) = location;
Console.WriteLine($"lat: {latitude}, long: {longitude}"); // lat: 52.5141156, long: 13.2857691

Совет. МетодDeconstructможет иметь несколько перегруженных версий, что может быть очень удобно, если вы хотите предложить разные комбинации значений из объекта.

Рекорды

Записи неявно реализуют метод Deconstruct на основе позиционных свойств типа времени компиляции. Его можно просто использовать так:

public record Location(double latitude, double longitude);

// ...

var location = new Location(52.5141156, 13.2857691);

// deconstruct record
(double latitude, double longitude) = location;
Console.WriteLine($"lat: {latitude}, long: {longitude}"); // lat: 52.5141156, long: 13.2857691

Дополнительная литература и ссылки