Megosztás:


switch kifejezés – mintamegfeleltetési kifejezések a switch kulcsszó használatával

switch A kifejezéssel egyetlen kifejezést értékelhet ki a jelölt kifejezések listájából. A kiértékelés egy bemeneti kifejezéssel egyező minta alapján történik. 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.

A C# nyelv referenciadokumentuma a C# nyelv legújabb kiadású verzióját ismerteti. Emellett a közelgő nyelvi kiadás nyilvános előzetes verziójú funkcióinak kezdeti dokumentációját is tartalmazza.

A dokumentáció azonosítja azokat a funkciókat, amelyeket először a nyelv utolsó három verziójában vagy az aktuális nyilvános előzetes verziókban vezetnek be.

Jótanács

Ha meg szeretné tudni, hogy mikor jelent meg először egy funkció a C#-ban, tekintse meg a C# nyelvi verzióelőzményeiről szóló cikket.

Az alábbi példa egy switch kifejezést mutat be. Az online térképen látható vizuális irányok értékeit enum a megfelelő számosságirányokká alakítja:

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 switch kulcsszó követ. Az előző példában ez a direction metódusparaméter.
  • A switch kifejezés karjai, vesszővel elválasztva. Minden switch kifejezé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 Direction kezeléséhez.
  • Elvetési minta: az enumerálás megfelelő tagjával Direction nem rendelkező egész számértékek kezeléséhez (például(Direction)10). Ez a minta teljessé teszi a switch 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áljon 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. Adjon meg egy esetőrt a when mintát követő kulcsszó után, 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.

Lásd még