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 aswitch
Kivá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 adirection
metódusparaméter. - A
switch
kifejezés karjai, vesszővel elválasztva. Mindenswitch
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 aswitch
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.