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.
Deklarace, konstanta a
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 jste ještě nepoužívali vzory jazyka C#. Kompletní jazyková pravidla najdete v referenčních informacích k vzorům.
U vstupního výrazu se použije vzor. Jazyk C# vyhodnocuje výraz, pak testuje vzor nebo zachycuje výslednou hodnotu. Deklarace, konstanta a var vzory odpovídají na tři praktické otázky:
- Model deklarace: Vytvořil výraz nenulovou hodnotu kompatibilního typu runtime? Pokud ano, deklarujte pro danou hodnotu proměnnou.
- Konstantní vzor: Vytvořil výraz jednu specifickou konstantní hodnotu?
-
varpattern: Jakou hodnotu výraz vytvořil? Zachyťte ho bez předchozího ověření jeho typu nebo hodnoty.
Testování a zachycení typu pomocí vzoru deklarace
Vzor deklarace se skládá z typu a označení. Typ určuje, který typ za běhu se má testovat. Označení deklaruje proměnnou, která přijímá odpovídající hodnotu.
Následující příklad získá object, takže výraz může mít mnoho různých typů. Model deklarace umožňuje, aby odpovídající větev používala desetinnou hodnotu bez samostatného testu typu a přetypování:
static void PrintPrice(object value)
{
if (value is decimal amount)
{
Console.WriteLine($"Price: {amount:C}");
}
}
V value is decimal amount:
-
valueje vstupní výraz. Jazyk C# ho vyhodnotí jako první. -
decimalje testovaný typ. Vzor odpovídá, když vyhodnocená hodnota není null a jeho typ běhu je kompatibilní sdecimal. -
amountje označení. Když se vzor shoduje, deklarujeamounta přiřadí jí desetinnou hodnotu.
Kompilátor sleduje, jestli místní proměnná obdrží hodnotu před načtením kódu. Toto sledování se nazývá určité přiřazení.
if Uvnitř bloku kompilátor ví, že amount byl přiřazen, protože blok se spustí pouze v případě, že vzor odpovídá. Kompilátor vygeneruje chybu, pokud se váš kód pokusí o přístup mimo amountif blok. Pokud value není decimal hodnota, proměnná amount není přiřazená k hodnotě.
Zvolte vzor deklarace, když odpovídající větev potřebuje použít výsledek jako testovaný typ. Kombinuje test, přetypování a deklaraci proměnné, čímž se zabrání opakování výrazu nebo psaní samostatného přetypování.
Vzory deklarace můžete použít také v případech, kdy jeden výraz může vytvořit několik užitečných typů:
static string FormatSensorValue(object reading) =>
reading switch
{
int count => $"Count: {count}",
double temperature => $"Temperature: {temperature:F1}°C",
string message => $"Message: {message}",
_ => "Unsupported reading"
};
Každá větev deklaruje proměnnou odpovídajícího typu, protože výsledek musí používat způsob formátování daného typu. Deklarativní vzor se shoduje pouze tehdy, když vyhodnocená hodnota není null a její běhový typ je již kompatibilní s testovaným typem pomocí převodů povolených pro vzory.
null nemá žádný typ běhu, aby se vzor shodoval. Vzor také nespouští uživatelem definované operátory převodu: Jedná se o test typu a zachytávání, nikoli požadavek na převod hodnoty na jiný typ. Kompletní pravidla kompatibility najdete v tématu Deklarace a vzory typů.
Porovnání konkrétní hodnoty s konstantním vzorem
Konstantní vzor testuje, zda výraz vytváří určitou konstantu, jako je číslo, řetězec, logická hodnota, člen výčtu, deklarovaná const hodnota nebo null.
Konstantní vzory odpovídají výrazu přepínače, když několik známých hodnot vytvoří jiný výsledek:
static string GetCommandMessage(Command command) =>
command switch
{
Command.Start => "Starting",
Command.Stop => "Stopping",
Command.Pause => "Pausing",
_ => "Unknown command"
};
Command je výčt, typ, který definuje sadu pojmenovaných konstant.
Command.Start, Command.Stop a Command.Pause jsou jeho členy výčtu, takže každé rameno příkazu switch používá konstantní vzor k testování jedné pojmenované hodnoty příkazu.
Tento formulář zvolte, pokud může mít příkaz několik diskrétních významů. Přepínací ramena udržují hodnoty a jejich výsledky pohromadě. Pro jedno jednoduché porovnání rovnosti se příkaz if, například if (command == Command.Start), obvykle čte snáz.
Porovnávání konstantních vzorů používá předdefinovaná pravidla rovnosti jazyka místo uživatelem definovaného == operátoru. Podrobná pravidla rovnosti a převodu najdete v odkazu na konstantní vzor.
Konstantní null vzor je užitečný pro spolehlivou kontrolu null:
static bool HasText(string? text) => text is not null;
Zvolte is null nebo is not null když kontrolujete stav null. Tyto vzory nevolají uživatelsky definovaný operátor rovnosti, ani když typ výrazu přetěžuje ==.
Zachycení výsledku pro strážce se vzorem var
Vzorvar odpovídá každému výsledku, včetně nulla deklaruje proměnnou, jejíž typ je typ kompilace vstupního výrazu. Může zachytit vypočítanou hodnotu, zatímco jiný vzor už odpovídá objektu:
static string GetDeliveryMessage(object delivery) =>
delivery switch
{
ExpressDelivery express
when EstimateDays(express) is var days && days <= 2
=> $"Arrives in {days} day{(days == 1 ? "" : "s")}",
ExpressDelivery => "Express delivery for your location takes more than two days",
_ => "Standard delivery"
};
static int EstimateDays(ExpressDelivery delivery) =>
delivery.MilesAway <= 500 ? 1 :
delivery.MilesAway <= 1_000 ? 2 : 3;
record ExpressDelivery(int MilesAway);
Vzor deklarace ExpressDelivery express nejprve zachycuje objekt doručení jako express. Volání metody EstimateDays(express) je vstupní výraz pro var vzor. Jazyk C# vyhodnotí volání této metody a var days zaznamená výsledný odhad jako days bez testování typu nebo hodnoty. Odhad může být jeden nebo dva dny, pokud guard uspěje. Výsledek arm vyžaduje zaznamenanou hodnotu pro nahlášení skutečného počtu dnů.
Běžnou místní proměnnou nelze deklarovat mezi vzorem přepínače a jeho when hlídačem. Při opětovném volání EstimateDays(express) ve výsledku by se výpočet opakoval. Tuto var formu vzoru zvolte, když kód již odpovídá a guard i výsledek vyžadují vypočtenou mezihodnotu.
Pokud zachycenou hodnotu nepotřebujete, použijte místo deklarace proměnné zástupný vzor _.