Eldobások és az eldobási minta

Tip

Ez a cikk az Alapismeretek szakasz része azon fejlesztők számára, akik már legalább egy programozási nyelvet ismernek, és c#-t tanulnak. Ha most ismerkedik a mintákkal, kezdje a mintailesztés áttekintésével. A teljes szintaxisért lásd az elvetési minta referenciáját.

Az alsóvonás token (_) azt jelzi, hogy nincs szükség egy értékre. Pontos jelentése attól függ, hogy hol jelenik meg:

Context _ jelentése
switch-kifejezés ága vagy beágyazott minta Az eredmény rögzítése nélkül egyező elvetési minta
Dekonstrukció vagy out érv Egy előállított értéket figyelmen kívül hagyó elvetés
Egy hozzárendelés, például _ = expression Elvetési hozzárendelés, amely kiértékeli a kifejezést, és figyelmen kívül hagyja annak eredményét
Két vagy több lambda-paraméter neve _ Olyan paraméterek elvetése , amelyek bemeneteit nem használják
var _ egy mintában Minta var elvetési megjelöléssel

Ezek az űrlapok közösek a helyesírásban és a szándékban, de nem cserélhetők fel.

Mintaegyezés a switch

Az alábbi példában a statusCode egy int. Minden kapcsolókar létrehoz egy string üzenetet, amelyet a program a konzolra ír. Az utolsó _ a 404 és 200 kivételével minden állapotkódot kezel:

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

    Console.WriteLine(message);
}

A program elvetési mintát alkalmaz egy bemeneti kifejezésre. A C# kiértékeli a kifejezést, és a _ a kiértékelt értékre illeszkedik anélkül, hogy rögzítené azt. Válassza a(z) _ elemet a switch-kifejezés utolsó ágaként, ha minden korábban nem kezelt értéknek ugyanazt a tartalékmegoldást kell használnia. Tedd utoljára, mert megfelel mindennek, beleértve a null.

A var _ alak egy var minta elvetési jelöléssel. Minden kiértékelt értéknek megfelel, de nem vezet be olvasható változót. A rövidebb _ elvetési mintát részesítse előnyben az összes kapcsoló esetében. A mintákról var és a megjelölésekről további információt a Deklaráció, az állandó és var a minták című témakörben talál.

Szétszerelési nyilatkozatok

GetForecast egy négy összetevőből álló tuple-t ad vissza: egy string várost és három int értéket a magas hőmérséklethez, az alacsony hőmérséklethez, valamint az eső valószínűségéhez. A dekonstruálási deklaráció megmarad city , és high mivel a program megjeleníti őket. Alacsony hőmérsékletre és esőre használható _ , mert a fel nem használt összetevők elnevezése azt jelenti, hogy a kódnak szüksége van rájuk:

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);
}

Ugyanez az elvetési szintaxis akkor működik, ha egy objektum metódusa Deconstruct több értéket hoz létre. Ezekről a formákról lásd a következőt: Tuple-ök és más típusok dekonstruálása.

Metódusok meghívása paraméterekkel out

Tegyük fel, hogy egy beviteli mező csak akkor fogadja el a szöveget, ha egész számot jelöl. A TryParse(String, Int32) metódus egy bool olyan értéket ad vissza, amely azt jelzi, hogy az elemzés sikeres volt-e. Emellett az elemzett out értéket a(z) int paraméterén keresztül is előállítja. A következő kódnak csak a logikai eredményre van szüksége a bemenet elfogadásához vagy elutasításához:

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 _);
}

Akkor használja out _ , ha csak a művelet sikeressége számít. Az elvetés egyértelművé teszi, hogy az elemzési számra nincs szükség. Ha a későbbi kódnak szüksége van a számra, adjon nevet az out argumentumnak, például out int number, és őrizze meg helyette ezt az értéket.

Egy elvetett hozzárendelés kiértékel egy kifejezést, _ = expressionés szándékosan figyelmen kívül hagyja annak eredményét. Ez olykor hasznos, ha a kifejezés önmagában nem érvényes utasítás.

Important

Ne használja a _ = Task.Run(...) vagy _ = SomeAsyncMethod() elemet egy feladat elvetésére az alkalmazás kódjában. Várja meg a feladatot, hogy a befejezése és a kivételek a hívási folyamatban maradjanak. Az elvetési hozzárendelések nem teszik biztonságossá a feladatokat, nem figyelik meg a kivételt, és nem hoznak létre támogatott tűz- és felejtési műveletet.

Nem használt lambdaparaméterek megjelölése

Egy EventHandler egy object? küldőt és egy EventArgs értéket kap. A következő kezelőnek egyik paraméter sem szükséges; csak a konzolra ír "Timer tick" . Ha mindkét paraméter neve _, azzal láthatóvá válik, hogy nincsenek használva, anélkül, hogy olyan neveket kellene kitalálni, amelyeket a függvénytörzs soha nem használ:

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

Adja meg az elvetett paramétereket, ha a delegált aláírás olyan bemeneteket igényel, amelyeket a lambda törzse nem használ. Ha egy lambda csak egy paraméterrel _rendelkezik, _ a visszamenőleges kompatibilitás szokásos paraméterneve marad.

Ne használja a(z) _ elemet azonosítóként

_ lehet egy szokásos azonosító olyan környezetekben, ahol a C# nem ismeri fel a elvetéseket. A hatókörben lévő, _ nevű változó kaphat olyan értékadást, amely eldobási értékadásnak tűnik. Mintakontextusban egy elérhető, _ nevű konstans vagy típus is megváltoztathatja a(z) _ értelmezését. Ne deklaráljon saját, _ nevű változókat, konstansokat vagy típusokat; az eldobási szándék jelzésére használja a(z) _ elemet.

Lásd még