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 switch
deyim 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 parametresidirdirection
. - virgülle
switch
ayrılmış ifade kolları. Herswitch
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 ifadeyiswitch
kapsamlı 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 true
değ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.