switch ifadesi (C# başvurusu)

C# 8.0'dan başlayarak, bir giriş ifadesiyle bir 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 switchdeyim hakkında switch bilgi için Seçim deyimleri makalesinin deyim bölümüne bakınswitch.

Aşağıdaki örnekte, çevrimiçi haritadaki switch görsel yol tariflerini temsil eden değerleri enum 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 .
  • İfadeswitch 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: sabit listesi tanımlı değerlerini Direction işlemek için.
  • Atma düzeni: 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.

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 derleyici bir hata oluşturur.

Servis talebi korumaları

Bir desen, bir arm ifadesinin değerlendirilme koşulunu belirtmek için yeterince açıklayıcı olmayabilir. Böyle bir durumda servis talebi koruyucusu kullanabilirsiniz. Bu, eşleşen bir desenle birlikte karşılanması gereken ek 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 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 vardesenleri olan ö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 durumdurInvalidOperationException. Ç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 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.