Odložení a vzor odložení

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#. Pokud s vzory začínáte, začněte přehledem porovnávání vzorů. Úplnou syntaxi najdete v referenci ke vzorku discard.

Podtržítko (_) oznamuje, že hodnota není nutná. Jeho přesný význam závisí na tom, kde se objeví:

Context Význam _
Větev výrazu switch nebo vnořený vzor Odkládací vzor, který se shoduje, aniž by zachytil výsledek
Dekonstrukce nebo out argumentace Odhození, které ignoruje jednu vyprodukovanou hodnotu
Přiřazení, jako je například _ = expression Zahazovací přiřazení, které vyhodnotí výraz a ignoruje jeho výsledek
Dva nebo více parametrů lambda s názvem _ Zahodit parametry , jejichž vstupy se nepoužívají
var _ ve vzoru Vzor var s označením zahození

Tyto formuláře sdílejí pravopis a záměr, ale nejsou zaměnitelné.

Porovnávání vzorů s switch

V následujícím příkladu statusCode je .int Každá větev přepínače vytvoří zprávu string, kterou program zapíše do konzole. Konečný _ zpracovává každý stavový kód kromě 200 a 404:

static void ShowStatus()
{
    int statusCode = 503;
    string message = statusCode switch
    {
        200 => "Ready",
        404 => "Not found",
        _ => "Another status"
    };

    Console.WriteLine(message);
}

U vstupního výrazu se použije vzor zahození. Jazyk C# vyhodnotí výraz a _ odpovídá vyhodnocené hodnotě, aniž by ji zachytil. Zvolte _ jako poslední větev výrazu switch, pokud má každá dříve nezpracovaná hodnota použít stejnou výchozí možnost. Dej to jako poslední, protože odpovídá všemu, včetně null.

Forma var _ je vzor var s označením pro zahazování. Shoduje se také s každou vyhodnocenou hodnotou, ale nezavádí čitelně pojmenovanou proměnnou. U přepínače upřednostňujte kratší _ vzor zahození. Další informace o var vzorech a označeních najdete v tématu Deklarace, konstanta a var vzory.

Deklarace dekonstrukce

GetForecast vrátí ntici se čtyřmi prvky: hodnotu typu string představující město a tři hodnoty typu int pro maximální teplotu, minimální teplotu a pravděpodobnost deště. Dekonstrukční deklarace zachovává city a high, protože je program zobrazuje. Používá _ se pro nízkou teplotu a šanci na déšť, protože pojmenování nepoužívaných součástí by znamenalo, že je kód potřebuje:

static void ShowForecast()
{
    var (city, high, _, _) = GetForecast();
    Console.WriteLine($"{city}: high {high}°C");

    static (string City, int High, int Low, int RainChance) GetForecast() =>
        ("Portland", 18, 9, 40);
}

Stejná syntaxe zahození funguje, když metoda objektu Deconstruct vytvoří několik hodnot. Informace o těchto formách naleznete v tématu Dekonstrukce n-tic a dalších typů.

Volání metod prostřednictvím parametru out

Předpokládejme, že vstupní pole přijímá text pouze tehdy, když představuje celé číslo. Metoda TryParse(String, Int32) vrátí bool zprávu, zda parsování proběhlo úspěšně. Vytvoří také parsovaný int prostřednictvím jeho out parametru. Následující kód potřebuje pouze logický výsledek pro přijetí nebo odmítnutí vstupu:

static void CheckInput()
{
    string text = "42";

    if (IsWholeNumber(text))
    {
        Console.WriteLine($"Accepted: {text}");
    }
    else
    {
        Console.WriteLine("Enter a whole number.");
    }

    static bool IsWholeNumber(string text) => int.TryParse(text, out _);
}

Používejte out _ pouze v případech, kdy záleží na úspěchu operace. Zahození znamená, že parsované číslo není potřeba. Pokud pozdější kód potřebuje číslo, dejte out argumentu název, například out int numbera místo toho tuto hodnotu zachovejte.

Přiřazení do discardu, _ = expression, vyhodnotí výraz a záměrně ignoruje jeho výsledek. Občas je to užitečné, když výraz jinak není platným příkazem.

Important

Nepoužívejte _ = Task.Run(...) ani _ = SomeAsyncMethod() k zahazování úlohy v kódu aplikace. Počkejte na dokončení úkolu, aby jeho dokončení i výjimky zůstaly v rámci volajícího toku. Přiřazení do discardu nezajistí, že úloha bude bezpečná, že bude zpracována její výjimka ani že vznikne podporovaná operace typu fire-and-forget.

Označení nepoužívaných parametrů lambda

object? přijímá EventHandler odesílatele a hodnotu EventArgs. Následující obslužná rutina nepotřebuje žádný parametr; zapisuje se pouze do konzoly "Timer tick" . Pojmenování obou parametrů _ zviditelní jejich nepoužitý stav bez vynalézání názvů, které tělo nikdy nepoužívá:

static void ShowLambdaDiscards()
{
    EventHandler handler = (_, _) => Console.WriteLine("Timer tick");
    handler(null, EventArgs.Empty);
}

Zvolte zahodit parametry, pokud podpis delegáta vyžaduje vstupy, které tělo lambda nepoužívá. Pokud má lambda pouze jeden parametr s názvem _, _ zůstane běžný název parametru pro zpětnou kompatibilitu.

Vyhněte se _ jako identifikátoru

_ může být běžný identifikátor v kontextech, kde jazyk C# nerozpozná zahození. Proměnné s názvem _, která je v daném rozsahu platnosti, lze přiřadit hodnotu způsobem, který vypadá jako odkládací přiřazení. V kontextu vzoru může přístupná konstanta nebo název _ typu také změnit způsob _ interpretace. Vyhněte se deklarování vlastních proměnných, konstant nebo typů pojmenovaných _; použijte _ ke komunikaci záměru zahození.

Viz také