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.
kapcsolókifejezés – mintaegyező kifejezések a
A kifejezéssel switch egyetlen kifejezést értékelhet ki a jelölt kifejezések listájából egy bemeneti kifejezéssel egyező minta alapján. A -like szemantikát egy utasításkörnyezetben támogató switchutasítással kapcsolatos switch információkért tekintse meg a switchKiválasztási utasítások című cikk utasítás szakaszát.
Az alábbi példa egy switch olyan kifejezést mutat be, amely egy online térkép vizuális irányait ábrázoló értékeket enum konvertál a megfelelő számosságirányokra:
public static class SwitchExample
{
public enum Direction
{
Up,
Down,
Right,
Left
}
public enum Orientation
{
North,
South,
East,
West
}
public static Orientation ToOrientation(Direction direction) => direction switch
{
Direction.Up => Orientation.North,
Direction.Right => Orientation.East,
Direction.Down => Orientation.South,
Direction.Left => Orientation.West,
_ => throw new ArgumentOutOfRangeException(nameof(direction), $"Not expected direction value: {direction}"),
};
public static void Main()
{
var direction = Direction.Right;
Console.WriteLine($"Map view direction is {direction}");
Console.WriteLine($"Cardinal orientation is {ToOrientation(direction)}");
// Output:
// Map view direction is Right
// Cardinal orientation is East
}
}
Az előző példa egy kifejezés alapvető elemeit switch mutatja be:
- Egy kifejezés, amelyet a
switchkulcsszó követ. Az előző példában ez adirectionmetódusparaméter. - A
switchkifejezés karjai, vesszővel elválasztva. Mindenswitchkifejezéskar tartalmaz egy mintát, egy opcionális kis- és nagybetűvédőt, egy=>jogkivonatot és egy kifejezést.
Az előző példában egy switch kifejezés a következő mintákat használja:
-
Állandó minta: az enumerálás definiált értékeinek
Directionkezeléséhez. -
Elvetési minta: az enumerálás megfelelő tagjával
Directionnem rendelkező egész számértékek kezeléséhez (például(Direction)10). Ezswitchteszi a kifejezést.
Fontos
A kifejezés által támogatott mintákról és további példákról további információt a switchMinták című témakörben talál.
A kifejezés eredménye switch annak az első switch kifejezéskarnak a kifejezése, amelynek mintája megegyezik a bemeneti kifejezéssel, és amelynek esetőrzője, ha van, kiértékeli a következőt true: . A switch kifejezéskarok kiértékelése szöveges sorrendben történik.
A fordító hibát okoz, ha egy alacsonyabb switch kifejezési ág nem választható ki, mert egy magasabb switch kifejezéskar megfelel az összes értékének.
Esetőr
Előfordulhat, hogy egy minta nem elég kifejező ahhoz, hogy meghatározza a kar kifejezésének kiértékelésének feltételét. Ilyen esetben használhatja az esetőrt. Az esetőr egy másik feltétel, amelyet egy egyeztetett mintával együtt kell kielégíteni. Az esetőrnek logikai kifejezésnek kell lennie. A mintát követő kulcsszó után when egy esetőrt kell megadnia, ahogy az alábbi példa is mutatja:
public readonly struct Point
{
public Point(int x, int y) => (X, Y) = (x, y);
public int X { get; }
public int Y { get; }
}
static Point Transform(Point point) => point switch
{
{ X: 0, Y: 0 } => new Point(0, 0),
{ X: var x, Y: var y } when x < y => new Point(x + y, y),
{ X: var x, Y: var y } when x > y => new Point(x - y, y),
{ X: var x, Y: var y } => new Point(2 * x, 2 * y),
};
Az előző példa beágyazott varmintákkal rendelkező tulajdonságmintákat használ.
Nem teljes kapcsolókifejezések
Ha egy switch kifejezés egyik mintája sem egyezik meg egy bemeneti értékkel, a futtatókörnyezet kivételt eredményez. A .NET Core 3.0-s és újabb verzióiban a kivétel egy System.Runtime.CompilerServices.SwitchExpressionException. A .NET-keretrendszerben a kivétel egy InvalidOperationException. A legtöbb esetben a fordító figyelmeztetést hoz létre, ha egy switch kifejezés nem kezeli az összes lehetséges bemeneti értéket.
A listaminták nem generálnak figyelmeztetést, ha nem kezelik az összes lehetséges bemenetet.
Jótanács
Annak biztosítása érdekében, hogy egy switch kifejezés kezelje az összes lehetséges bemeneti értéket, adjon meg egy switchkifejezéskart egy elvetési mintával.
C# nyelvspecifikáció
További információkért tekintse meg a switchC#-nyelv specifikációjának kifejezés szakaszát.