switch ifadesi - anahtar sözcüğünü switch kullanarak desen eşleştirme ifadeleri

Bir giriş ifadesiyle desen eşleşmesini temel alan aday ifadeler listesinden tek bir ifadeyi değerlendirmek için ifadeyi kullanırsınız switch . Deyim bağlamında -like semantiğini destekleyen deyim hakkında switch bilgi için Selection deyimleri makalesinin deyim bölümüne bakınswitch.switch

Aşağıdaki örnekte, çevrimiçi bir switch haritadaki görsel yol tariflerini enum temsil eden değerleri ilgili kardinal yol tariflerine dönüştüren bir ifade gösterilmektedir:

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
    }
}

Yukarıdaki örnekte bir switch ifadenin temel öğeleri gösterilmektedir:

  • Bir ifade ve switch ardından anahtar sözcüğü. Yukarıdaki örnekte yöntem parametresidir direction .
  • İfade switch kolları, virgülle ayrılmıştır. Her switch ifade kolu bir desen, isteğe bağlı bir büyük/küçük harf koruyucusu, => belirteç ve bir ifade içerir.

Yukarıdaki örnekte, bir switch ifade aşağıdaki desenleri kullanır:

  • Sabit desen: numaralandırmanın tanımlı değerlerini Direction işlemek için.
  • Atma deseni: Numaralandırmanın karşılık gelen üyesi Direction olmayan herhangi bir tamsayı değerini işlemek için (örneğin, (Direction)10). Bu, ifadeyi switchkapsamlı hale getirir.

Önemli

İfade tarafından switch desteklenen desenler ve daha fazla örnek için bkz . Desenler.

bir switch ifadenin sonucu, deseni giriş ifadesiyle eşleşen ve varsa büyük/küçük harf koruyucusu olarak değerlendirilen ilk switch ifade kolunun ifadesinin truedeğeridir. İfade switch kolları metin sırasına göre değerlendirilir.

Derleyici, daha yüksek switch bir ifade kolu tüm değerleriyle eşleştiğinden daha düşük switch bir ifade kolu seçilemediğinde bir hata oluşturur.

Servis talebi korumaları

Bir desen, bir arm ifadesinin değerlendirilmesi için koşulu belirtmek için yeterince açıklayıcı olmayabilir. Böyle bir durumda, servis talebi koruyucusu kullanabilirsiniz. Servis talebi koruyucusu , eşleşen bir desenle birlikte karşılanması gereken başka bir koşuldur. Büyük/küçük harf koruyucu bir Boole ifadesi olmalıdır. Aşağıdaki örnekte gösterildiği gibi, bir deseni when izleyen anahtar sözcüğünden sonra bir servis talebi koruyucusu belirtirsiniz:

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),
};

Yukarıdaki örnekte, iç içe var desenlerine sahip özellik desenleri kullanılır.

Kapsamlı olmayan anahtar ifadeleri

İfadenin switch desenlerinden hiçbiri bir giriş değeriyle eşleşmiyorsa çalışma zamanı bir özel durum oluşturur. .NET Core 3.0 ve sonraki sürümlerde özel durumdur System.Runtime.CompilerServices.SwitchExpressionException. .NET Framework'te özel durum bir InvalidOperationException'dir. Çoğu durumda, bir ifade tüm olası giriş değerlerini işlemezse derleyici bir switch uyarı oluşturur. Tüm olası girişler işlenmediğinde liste desenleri uyarı oluşturmaz.

İpucu

bir switch ifadenin tüm olası giriş değerlerini işlediğini garanti etmek için, atma desenine sahip bir switchifade kolu sağlayın.

C# dili belirtimi

Daha fazla bilgi için özellik teklifi notunun switchifade bölümüne bakın.

Ayrıca bkz.