Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Deklaráció, állandó és
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?
-
varminta: 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:
-
valuea bemeneti kifejezés. A C# ezt először kiértékeli. -
decimala 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)decimalelemmel. -
amounta megjelölés. Amikor a minta egyezik, deklaráljaamounté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.