Megosztás a következőn keresztül:


kapcsolókifejezés – mintaegyező kifejezések a switch kulcsszó használatával

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ó utasítással kapcsolatos switch információkért tekintse meg aswitchKiválasztási utasítások című cikk utasítás szakaszát.switch

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 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 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 switch Mintá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-keretrendszer 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.

Tipp.

Annak biztosítása érdekében, hogy egy switch kifejezés kezelje az összes lehetséges bemeneti értéket, adjon meg egy switch kifejezéskart egy elvetési mintával.

C# nyelvspecifikáció

További információt a switch funkciójavaslat megjegyzésének kifejezés szakaszában talál.

Lásd még