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

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

Aşağıdaki örnekte, çevrimiçi bir switch haritadaki görsel yönlerini temsil eden değerleri enum ilgili kardinal yönlere 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 .
  • virgülle switch ayrılmış ifade kolları. 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 da 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 alt switch ifade kolu seçilemediğinde bir hata oluşturur.

Vaka korumaları

Desen, arm ifadesinin değerlendirilme koşulunu belirtmek için yeterince açıklayıcı olmayabilir. Böyle bir durumda, servis talebi koruyucusu kullanabilirsiniz. Servis talebi koruyucusu, eşleşen 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, anahtar sözcüğünden when sonra bir desen izleyen bir büyük/küçük harf 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 vardesenlerine 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'da özel durum bir InvalidOperationException'dir. Çoğu durumda, bir switch ifade tüm olası giriş değerlerini işlemezse derleyici bir 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 switch ifade kolu sağlayın.

C# dili belirtimi

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

Ayrıca bkz.