Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tip
Tento článek je součástí části Základy pro vývojáře, kteří už znají aspoň jeden programovací jazyk a učí se jazyk C#. Začněte přehledem porovnávání vzorů , pokud jsou pro vás vzory nové.
Dekonstrukce přiřazuje jednotlivé části hodnoty – její komponenty – k více proměnným v jedné operaci. Součásti ntice jsou její prvky zpřístupněné podle pozice. Jiný typ může vystavit komponenty definováním Deconstruct metody.
Poziční záznamy, které deklarují své vlastnosti jako parametry podobné konstruktoru, mají automaticky vygenerovanou metodu Deconstruct.
Rozložení turblice
Předpokládejme, že metoda vrátí ntici s daty města. Jednotlivé komponenty můžete číst jednotlivě:
var cityData = QueryCityData("New York City");
var city = cityData.City;
var population = cityData.Population;
var area = cityData.Area;
Dekonstrukce přiřadí tyto komponenty v jednom kroku:
(string city, int population, double area) = QueryCityData("New York City");
Můžete také nechat jazyk C# odvodit typy proměnných:
var (city, population, area) = QueryCityData("New York City");
Dekonstrukce může v jednom přiřazení kombinovat existující proměnné, nově deklarované proměnné a zástupné proměnné:
(city, var population, _) = QueryCityData("New York City");
Zvolte formu, která usnadní čtení kódu. Jedna var před závorkou je často nejjasnější implicitní formou. Můžete také kombinovat explicitní typy a var uvnitř závorek, ale tato forma je obvykle obtížnější rychle přehlédnout. Pokud potřebujete jenom některé hodnoty, použijte discardy místo vynechání pozic.
Ignorování nepotřebných hodnot pomocí discardů
Každá vygenerovaná hodnota musí odpovídat pozici na levé straně přiřazení. Pokud nepotřebujete jednu nebo více pozic, použijte _ jako zástupný prvek:
var (_, _, population1960, _, population2010) = QueryPopulationDataForYears(
"New York City", 1960, 2010);
Zde se vrátí název města, dva roky a dvě hodnoty populace. Dekonstrukce uchovává pouze hodnoty populace, protože výpočet používá pouze tyto komponenty.
Rozložit uživatelsky definované typy
Třída, struktura nebo rozhraní mohou podporovat dekonstrukci deklarováním metody Deconstruct. Každá komponenta se stane out parametrem, což metodě umožňuje přiřadit hodnotu zpět proměnné volajícího, aniž by ji vracela. Vzhledem k tomu, že každá komponenta je vrácena prostřednictvím parametru out , metoda sama vrátí void:
public void Deconstruct(out string firstName, out string middleName, out string lastName)
{
firstName = FirstName;
middleName = MiddleName;
lastName = LastName;
}
Pak můžete dekonstruovat instanci přímo:
var (firstName, middleName, lastName) = passenger;
Typ může poskytnout více Deconstruct přetížení s různou aritou – počtem parametrů, které out metoda deklaruje – aby volající mohli zvolit, kolik komponent se má načíst:
public void Deconstruct(out string firstName, out string lastName)
{
firstName = FirstName;
lastName = LastName;
}
public void Deconstruct(out string firstName, out string middleName, out string lastName)
{
firstName = FirstName;
middleName = MiddleName;
lastName = LastName;
}
public void Deconstruct(out string firstName, out string lastName, out string city, out string state)
{
firstName = FirstName;
lastName = LastName;
city = City;
state = State;
}
Dvě přetížení se stejným počtem out parametrů jsou nejednoznačná. Kompilátor hlásí chybu pro nejednoznačné volání, takže přetížení rozlišujte podle arity, nejen podle typů parametrů.
Zahození funguje také s dekonstrukcí definovanou uživatelem. Další informace o zahození obecně najdete v tématu Zahození a vzor discard:
var (firstName, _, city, _) = passenger;
Rozložit záznamy
Poziční záznam record nebo record struct deklaruje své vlastnosti jako parametry v samotné deklaraci typu, podobně jako konstruktor. Kompilátor pro vás vygeneruje metodu Deconstruct s out parametry odpovídajícími těmto pozičním parametrům:
var (city, highTempC, lowTempC) = forecast;
Pouze poziční parametry se účastní vygenerované dekompozice. Další vlastnosti, které deklarujete jinde v záznamu, se nepřidají automaticky.
Dekonstruujte typy, které nevlastníte
Pokud nemůžete změnit typ, můžete stále podporovat dekonstrukci tím, že napíšete rozšiřující metodu – statickou metodu, která přidá metodu Deconstruct do typu, který nevlastníte, jako by byla členem tohoto typu. Po přidání metody může libovolná Uri hodnota použít syntaxi dekonstrukce:
static class UriExtensions
{
public static void Deconstruct(this Uri uri, out string scheme, out string host, out int port)
{
scheme = uri.Scheme;
host = uri.Host;
port = uri.Port;
}
}
Stejné pravidlo nejednoznačnosti platí i zde: dvě rozšiřující Deconstruct metody se stejnou aritou jsou nejednoznačné. Nejednoznačnost může také nastat mezi metodou instance Deconstruct a rozšiřující metodou se stejnou aritou. V obou případech kompilátor hlásí chybu nejednoznačného volání.
Vestavěná dekonstrukce u systémových typů
Některé systémové typy už definují metodu Deconstruct pomocí stejného mechanismu, který byste použili pro vlastní typy. Podporuje například System.Collections.Generic.KeyValuePair<TKey,TValue> dekonstrukci, což činí iteraci slovníkem stručnou:
foreach (var (repo, commitCount) in repoCommitCounts)
{
Console.WriteLine($"{repo} had {commitCount:N0} commits in this snapshot.");
}
Dekonstrukce a pattern matching
Metoda Deconstruct také umožňuje poziční vzory pro tento typ. Poziční vzor testuje a dekonstrukuje hodnotu v jednom kroku pomocí stejné syntaxe závorek jako dekonstrukce: person is ("Alice", 30) odpovídá Person, jehož dekonstruované součásti se rovnají těmto hodnotám. Toto se liší od property pattern, který testuje pojmenované vlastnosti přímo, například person is { Name: "Alice", Age: 30 }. Vzory vlastností jsou obvykle srozumitelnější při popisu tvarů objektů, protože názvy členů vysvětlují test. Poziční vzory jsou nejsilnější, pokud pořadí již nese význam, například u ntic nebo jiných malých seřazených hodnot.