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 parametresidirdirection
. - İfade
switch
kolları, virgülle ayrılmıştır. 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, 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 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 switch
ifade kolu sağlayın.
C# dili belirtimi
Daha fazla bilgi için özellik teklifi notunun switch
ifade bölümüne bakın.