Deklaráció, állandó és var minták

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. Kezdje a mintaegyeztetés áttekintésével , ha korábban még nem használt C#-mintákat. A teljes nyelvi szabályokért tekintse meg a mintákra vonatkozó hivatkozást.

A rendszer mintát alkalmaz egy bemeneti kifejezésre. A C# kiértékeli a kifejezést, majd a minta teszteli vagy rögzíti az eredményként kapott értéket. A deklaráció, az állandó és var a minták három gyakorlati kérdésre válaszolnak:

  • Deklarációs minta: A kifejezés nem null értékű, kompatibilis futásidejű típust eredményezett? Ha igen, deklaráljon egy változót ehhez az értékhez.
  • Állandó minta: A kifejezés egy konkrét állandó értéket hozott létre?
  • var minta: Milyen értéket hozott létre a kifejezés? Rögzítse anélkül, hogy előbb ellenőrizné a típusát vagy az értékét.

Típus tesztelése és rögzítése deklarációs mintával

A deklarációs minta típusból és megjelölésből áll. Ez a típus határozza meg a tesztelni kívánt futásidejű típust. A kijelölés deklarálja az egyező értéket fogadó változót.

Az alábbi példa kap egy object, így a kifejezés számos különböző típust eredményezhet. A deklarációs minta lehetővé teszi, hogy az egyező ág decimális értéket használjon külön típusteszt és leadás nélkül:

static void PrintPrice(object value)
{
    if (value is decimal amount)
    {
        Console.WriteLine($"Price: {amount:C}");
    }
}

In value is decimal amount:

  • value a bemeneti kifejezés. A C# ezt először kiértékeli.
  • decimal a tesztelt típus. A minta akkor illeszkedik, ha a kiértékelt érték nem null, és a futásidejű típusa kompatibilis a(z) decimal elemmel.
  • amount a megjelölés. Amikor a minta egyezik, deklarálja amount és hozzárendeli a tizedesértéket.

A fordító nyomon követi, hogy egy helyi változó kap-e értéket, mielőtt a kód felolvassa. Ezt a nyomkövetést határozott hozzárendelésnek nevezzük. A if blokkon belül a fordító tudja, hogy a amount értéket kapott, mert a blokk csak akkor fut le, ha a minta illeszkedik. A fordító hibát jelez, ha a kód megpróbál hozzáférni a amount blokkon kívül a(z) if elemhez. Ha value nem érték decimal , akkor a változó amount nincs hozzárendelve egy értékhez.

Válasszon deklarációs mintát, ha az egyező ágnak tesztelt típusként kell használnia az eredményt. Kombinálja a tesztet, az átalakítást és a változódeklarációt, így nem kell megismételni a kifejezést, vagy külön leadást írni.

Deklarációs mintákat is használhat, ha egy kifejezés több hasznos típust is létrehozhat:

static string FormatSensorValue(object reading) =>
    reading switch
    {
        int count => $"Count: {count}",
        double temperature => $"Temperature: {temperature:F1}°C",
        string message => $"Message: {message}",
        _ => "Unsupported reading"
    };

Minden kar egy egyeztetett típusú változót deklarál, mert az eredményhez az adott típus formázási viselkedése szükséges. A deklarációs minta csak akkor egyezik meg, ha a kiértékelt érték nem null értékű, és már rendelkezik olyan futásidejű típussal, amely kompatibilis a tesztelt típussal a mintákhoz engedélyezett konverziókon keresztül. null nem rendelkezik futásidejű típussal ahhoz, hogy a minta egyezzen. A minta nem futtat felhasználó által definiált konverziós operátorokat is: Ez egy típusteszt és rögzítés, nem pedig egy kérés, amely az értéket egy másik típusra konvertálja. A teljes kompatibilitási szabályokért tekintse meg a Deklaráció és a típusminták című témakört.

Adott érték egyeztetése állandó mintával

Az állandó minta azt ellenőrzi, hogy egy kifejezés létrehoz-e egy adott állandót, például számot, sztringet, logikai értéket, enumerált tagot, deklarált const értéket vagy null.

Az állandó minták akkor illeszkednek egy kapcsolókifejezéshez, ha több ismert érték eltérő eredményt ad:

static string GetCommandMessage(Command command) =>
    command switch
    {
        Command.Start => "Starting",
        Command.Stop => "Stopping",
        Command.Pause => "Pausing",
        _ => "Unknown command"
    };

Command egy szám, egy típus, amely névvel ellátott állandók készletét határozza meg. A Command.Start, Command.Stop és Command.Pause ennek az enum-nak a tagjai, így minden switch-ág egy konstans mintával vizsgál egy megnevezett parancsértéket.

Akkor válassza ezt az űrlapot, ha a parancs több különálló jelentéssel is rendelkezhet. A kapcsolókarok összekapcsolják az értékeket és azok eredményeit. Egy egyszerű egyenlőségi összehasonlításhoz if egy ilyen if (command == Command.Start) állítás általában könnyebben olvasható.

A konstansminták egyeztetése a felhasználó által definiált == operátorok helyett beépített nyelvi egyenlőségi szabályokat használ. A részletes egyenlőségi és átalakítási szabályokért tekintse meg az állandó mintareferenciát.

Az null állandó minta megbízható null értékű ellenőrzéshez hasznos:

static bool HasText(string? text) => text is not null;

A nullállapot ellenőrzésekor válassza a(z) is null vagy is not null lehetőséget. Ezek a minták nem hívják meg a felhasználó által definiált egyenlőségoperátort, még akkor sem, ha a kifejezés típusa túlterheli a(z) == operátort.

Eredmény rögzítése egy var mintával rendelkező őrhöz

A var minta megfelel minden eredménynek, beleértve a nullváltozót is, és deklarál egy változót, amelynek típusa a bemeneti kifejezés fordítási idejének típusa. Rögzíthet egy számított értéket, miközben egy másik minta már megfelel egy objektumnak:

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

A deklarációs minta ExpressDelivery express először a kézbesítési objektumot rögzíti a következőként express: . A EstimateDays(express) metodushívás a var minta bemeneti kifejezése. A C# kiértékeli az adott metódushívást, és var days a kapott becslést days értékként rögzíti anélkül, hogy ellenőrizné annak típusát vagy értékét. A becslés egy vagy két nap lehet, amikor az őr sikeres. A kar eredményének a rögzített értékre van szüksége a napok tényleges számának jelentéséhez.

A hagyományos helyi változók nem deklarálhatók a kapcsolókar mintája és az őre when között. A EstimateDays(express) újbóli meghívása az eredményben megismételné a számítást. Válassza ezt a var mintaalakot, ha a kód már illeszkedik, és mind a feltételnek, mind az eredménynek szüksége van egy kiszámított köztes értékre.

Ha nincs szüksége a rögzített értékre, használja az elvetési mintát _ a változó deklarálása helyett.

Lásd még