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.
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 a minták újak Önnek. A teljes nyelvi szabályokért tekintse meg a nyelvi referencia relációs mintáit és logikai mintáit .
A relációs és logikai minták tartományokat, alternatívákat és kizárásokat írnak le. A következő módszer kombinálja őket egy hőmérséklet besorolásához:
static string ClassifyTemperature(int temperature) =>
temperature switch
{
< 0 => "Below freezing",
>= 18 and <= 24 => "Comfortable",
(>= 0 and < 10) or > 30 => "Far outside the comfortable range",
_ => "Cool or warm"
};
A kifejezés temperature a minta bemenete. A C# egyszer kiértékeli, és minden kapcsolókar teszteli az eredményként kapott értéket. A karok a következő teszteket mutatják be:
-
< 0egy határt tesztel. -
>= 18 and <= 24egy tartományt tesztel. -
(>= 0 and < 10) or > 30két alternatív tartományt tesztel.
Ez a cikk a mintákat és az imperatív feltételeket mutatja be, így megismerheti az egyes űrlapokat, és összehasonlíthatja, hogyan fejezik ki ugyanazokat a döntéseket. Egyetlen feltétel mindkét formában hasonló lehet. A minták megkönnyítik a kapcsolódó ágak olvasását azáltal, hogy az eredmények mellett tartják a választási lehetőségeket. Válassza ki azt az űrlapot, amely a legkönnyebben érthetővé teszi a kódot.
Értékek összehasonlítása relációs mintákkal
A relációs minta a mintabemenetet egy fordítási idejű konstanssal hasonlítja össze a <, >, <= vagy >= használatával. A fordítási idő állandója az az érték, amelyet a fordító kiértékelhet a program összeállítása során. A numerikus és karakterkonstansok, const valamint a kompatibilis numerikus vagy karaktertípusok változói reprezentatív példák. A szokásos változók, tulajdonságok, metódushívások és static readonly mezők nem fordítási időállandók. A nyitó példában a >= 18 és a <= 24 is ugyanazt a kiértékelt temperature értéket teszteli.
Ugyanez a relációs szimbólum megjelenhet egy hétköznapi kifejezésben vagy mintában. Az alábbi példa mindkét formát hőmérséklettel használja:
static void ShowExpressionAndPattern(int temperature, int threshold)
{
bool belowThreshold = temperature < threshold;
bool belowFreezing = temperature is < 0;
string description = temperature switch
{
< 0 => "Freezing",
0 => "Freezing point",
> 0 => "Above freezing"
};
Console.WriteLine(
$"Below threshold: {belowThreshold}; " +
$"below freezing: {belowFreezing}; {description}");
}
temperature < threshold egy relációs kifejezés. Kiértékeli mindkét operandust, és egy bool eredményez. Bármelyik operandus lehet nem konzisztens kifejezés.
A(z) temperature elemben a(z) temperature is < 0 a minta bemeneti kifejezése. A C# kiértékeli, és a relációs minta < 0 teszteli az eredményként kapott értéket. A switch-ágban a(z) switch előtti kifejezés adja meg a bemenetet, így a minta csak < 0 tartalmaz.
A kifejezés összehasonlítható temperature a változóval threshold. A relációs minta operandusának fordítási időállandónak kell lennie, ezért akkor használja a relációs kifejezést, ha az összehasonlító érték változó. Ha az összehasonlító érték állandó, bármelyik űrlap működhet.
Ha a megfelelő operandus állandó, elsősorban az olvashatóság érdekében válasszon. A relációs kifejezések gyakran illeszkednek egy közvetlen összehasonlításhoz. A relációs minta más mintákkal is kombinálható, és természetesen alkalmazható akkor, amikor több tartomány switch-eredményekhez van hozzárendelve.
Feltételek kombinálása logikai mintákkal
A logikai minták a minták operátoraival andkombinálják vagy tagadják a mintákat, orés not:
- Egy
andminta akkor egyezik, ha mindkét beágyazott minta egyezik. - Egy
orminta akkor egyezik, ha valamelyik beágyazott minta egyezik. - A
notminta akkor sikeres, ha a beágyazott minta meghibásodik.
Az első példa a or elemet egy tartomány leírására, a and elemet pedig az alternatívák leírására használja. A not minta kizárhat egy értéket, mint a status is not Status.Complete. Az alábbi módszerek mindkét űrlapot megjelenítik, így megtanulhatja a szintaxisukat, és összehasonlíthatja, hogyan fejezik ki ugyanazt a tesztet:
static bool IsWeekendPattern(DayOfWeek day) =>
day is DayOfWeek.Saturday or DayOfWeek.Sunday;
static bool IsWeekendImperative(DayOfWeek day) =>
day == DayOfWeek.Saturday || day == DayOfWeek.Sunday;
A mintaalak két, a or által összekapcsolt állandó mintát használ. Az imperatív űrlap két egyenlőségi kifejezést használ a feltételes VAGY operátorral ||összekapcsolva. Mindkét megfogalmazás tömör és egyértelmű ennél az egy feltételnél. Válassza ki a környező kódnak leginkább megfelelő űrlapot. A minták gyakran több kapcsolódó választási lehetőséget is tisztáznak egy switchadott példában, mint a nyitó példában.
A mintaoperátorok logikai kifejezések helyett mintákat alkotnak: and a minta-kötőjeleknek, or a minta alternatíváinak és not a mintaelválasztásnak felelnek meg. A logikai kifejezések &&-t, ||-et és !-t használnak. Válassza a(z) or lehetőséget, ha több mintaalternatíva ugyanazt az eredményt eredményezi. Válassza a(z) not lehetőséget, ha a kizárt minta megadása világosabb, mint az összes elfogadott érték felsorolása.
Csoportosítási minták zárójelekkel
A zárójeles minták zárójelekkel jelenítik meg vagy módosítják a beágyazott minták csoportosítását. A kötési erő határozza meg, hogy egy operátor mely mintázatoperandusokat vonja össze, hasonlóan az implicit csoportosításhoz, amikor nem használ zárójeleket. A C# a következő kötési sorrendet adja meg:
notandor
Az alábbi teszt az 1–3. prioritást vagy a 9. kiemelt prioritást fogadja el:
static bool IsAcceptedPriority(int priority) =>
priority is (>= 1 and <= 3) or 9;
A fordító and elemet or elé csoportosítja. A zárójelek egyértelművé teszik a kívánt csoportosítást és a két alternatívát: az 1 és 3 közötti tartományt vagy a 9-et. Az olvashatóság érdekében használjon zárójeleket, amikor egy minta vegyíti a(z) and és or elemeket, vagy ha a(z) not egy összetett mintára vonatkozik. A zárójelek az alapértelmezett csoportosítást is módosíthatják, ahogyan a .not (>= 1 and <= 3)
A beágyazott minták futásidejű ellenőrzési sorrendje nincs meghatározva, és a mintaoperátorok a rövidzárlatú logikai szabályok helyett a mintaegyeztetési szabályokat követik. Beágyazott mintákat írhat, hogy eredményük független legyen az ellenőrzési sorrendben.
when Védőőr használata külön feltételhez
A logikai minták akkor működnek a legjobban, ha a beágyazott minták magát a bemeneti értéket írják le. A when őrfeltétel egy case címke vagy switch-ág további boolean feltétele. Használjon védőt, ha a döntés a minta bemenetétől eltérő információktól is függ.
A következő figyelmeztetés a hőmérséklettől és egy külön isOutdoors értéktől függ:
static string GetHeatWarning(int temperature, bool isOutdoors) =>
temperature switch
{
> 35 when isOutdoors => "High heat outdoors",
> 35 => "High heat",
_ => "No heat warning"
};
A relációs minta > 35 a bemenetet temperature írja le. Az őr when isOutdoors külön értéket ellenőriz. Az őr akkor is előnyösebb, ha a feltételhez metódushívásra vagy logikai kifejezésre van szükség, amely nem fejezi ki egyértelműen a minta szintaxisát.
Relációs és logikai mintákat használjon, ha megkönnyítik a bemenet engedélyezett alakzatainak vagy értékeinek megtekintését, különösen több kapcsolókaron. Használjon egy szokásos logikai kifejezést, ha a közvetlen feltételt egyszerűbben állítja be. Használjon védőt when , ha a kapcsolóválasztás egy külön értéktől vagy egy logikai kifejezésként jobban kifejezett feltételtől függ.