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é. Kompletní pravidla jazyka najdete v referenčních informacích k vlastnostem a pozičním vzorům .
Vlastnosti i poziční vzory testují obě části hodnoty. Rozdíl je v tom, jak tyto části identifikují:
- Vzor vlastností pojmenuje vlastnosti nebo pole, která chcete testovat.
- Poziční vzor identifikuje hodnoty podle jejich pořadí.
Dekonstrukce zveřejňuje seřazenou sadu hodnot komponent. Ntice již má pořadí prvků; viz dekonstrukce ntic. Pro jiný typ metoda definuje, Deconstruct které hodnoty komponent jsou vystaveny a jejich pořadí.
Porovnání názvů a pozic
Následující vzor vlastnosti testuje dvě pojmenované vlastnosti čtení počasí s hodnotami teploty ve stupních Celsia:
static bool IsHotAndHumid(WeatherReading reading) =>
reading is { TemperatureC: > 30, HumidityPercent: > 70 };
sealed record WeatherReading(int TemperatureC, int HumidityPercent);
Následující poziční vzor testuje hodnotu signálu následovanou logickou hodnotou:
static string GetCrossingInstruction(
PedestrianSignal signal, bool crossingIsClear) =>
(signal, crossingIsClear) switch
{
(PedestrianSignal.Walk, true) => "Cross now",
(PedestrianSignal.Walk, false) => "Wait for the crossing to clear",
_ => "Wait for the walk signal"
};
enum PedestrianSignal
{
Stop,
Walk
}
Vzor vlastnosti identifikuje své vstupy podle názvů TemperatureC a HumidityPercent. Křížový kód vytvoří ntici ze samostatných hodnot signal a crossingIsClear. N-ticový vzor pak tyto hodnoty identifikuje podle pořadí: signal jako první a crossingIsClear jako druhou. Poziční vzor se velmi dobře hodí, protože tato nově vytvořená n-tice má pouze dvě hodnoty a jejich pořadí má při rozhodování, zda dojde ke křížení, jasný význam.
Vyberte vzor vlastností, když názvy členů pomáhají vysvětlit test. Vzory vlastností jsou obvykle jasnější pro třídy, struktury a záznamy. Zvolte poziční vzor, pokud pořadí již dává hodnotám jasný význam. Poziční vzory jsou nejužitečnější při použití s nticemi, které kombinují více souvisejících hodnot do jediné hodnoty s pevně daným pořadím.
Sledování vnořených vstupů v rekurzivních vzorech
Vlastnosti a poziční vzory jsou rekurzivní vzory: Na každou vlastnost, pole nebo pozici, kterou vyberou, aplikují jiný vzor. Vybraná hodnota se stane vstupem do vnořeného vzoru.
V reading je výraz IsHotAndHumid vstupem pro vzor vlastnosti. Jazyk C# vyhodnotí tento výraz před porovnáním. Vzor získá ze výsledného objektu dvě hodnoty:
- Relační vzor
> 30testuje hodnotuTemperatureC. - Relační vzor
> 70testuje hodnotuHumidityPercent.
Vnější test typu je volitelný a rekurzivní klauzule vzoru mohou být prázdné. Například prázdný vzor { } vlastnosti odpovídá jakékoli hodnotě, která není vyhodnocena hodnotou null.
Vlastnosti a poziční vzory odpovídají pouze hodnotám, které nejsou vyhodnoceny jako null. Pokud null je součástí vstupní domény, zvolte rekurzivní vzor, který nejprve kontroluje nenulovou hodnotu:
static string DescribeNullableInput(object? value)
{
if (value is not { } nonNullValue)
{
return "No value";
}
return nonNullValue switch
{
DateTime => "Date",
string => "Text",
_ => "Another type"
};
}
Vstupní výraz je value. C# jej vyhodnotí a vzor vlastnosti { } před přiřazením do nonNullValue otestuje, zda výsledná hodnota není null. Následující výraz přepínače pak může otestovat více možných typů modulu runtime. Vzory typů DateTime a string nemají označení, protože metoda potřebuje pouze rozlišit jednotlivé typy, nikoli zachytit jejich hodnotu.
Pokud rekurzivní klauzule vzoru obsahují vnořené vzory, každá vybraná vlastnost, pole nebo pozice se stane vstupem do vnořeného vzoru.
Před složené závorky můžete přidat test typu, když vstupní výraz může vytvořit různé typy. K otestování vnořené vlastnosti můžete použít také cestu člena:
static string DescribeDate(object? value) =>
value switch
{
DateTime { Date.DayOfWeek:
DayOfWeek.Saturday or DayOfWeek.Sunday } => "Weekend date",
DateTime => "Weekday date",
null => "No date",
_ => "Not a date"
};
value je vstupní výraz. C# jej nejprve vyhodnotí a otestuje, zda je výsledná hodnota DateTime. Hodnota Date vlastnosti se pak stane vstupem pro přístup člena DayOfWeek . Nakonec se DayOfWeek hodnota stane vstupem logického vzoru, který testuje dvě konstanty. Porovnávání proběhne úspěšně, pokud má vnější hodnota zadaný typ a každý objekt potřebný podél cesty člena není null.
Porovnání vzorů s příkazy větvení
Předchozí DescribeDate metoda vyjadřuje čtyři výsledky jako vzory:
static string DescribeDate(object? value) =>
value switch
{
DateTime { Date.DayOfWeek:
DayOfWeek.Saturday or DayOfWeek.Sunday } => "Weekend date",
DateTime => "Weekday date",
null => "No date",
_ => "Not a date"
};
Následující metoda vytvoří stejné výsledky s řadou imperativních příkazů větvení:
static string DescribeDateWithBranches(object? value)
{
if (value is DateTime date)
{
if (date.DayOfWeek == DayOfWeek.Saturday ||
date.DayOfWeek == DayOfWeek.Sunday)
{
return "Weekend date";
}
return "Weekday date";
}
if (value is null)
{
return "No date";
}
return "Not a date";
}
Verze založená na vzorech udržuje možné výsledky, když několik větví testuje typ a tvar hodnoty. Imperativní podoba výslovně vyjadřuje každý test i krok vrácení. U jedné podmínky může některý formulář vypadat podobně. S rostoucím počtem souvisejících větví můžou vzory usnadnit porovnání alternativ.