C# 8'den itibaren eklenen pattern matching özellikleri, switch ifadelerini ve koşullu kontrolleri dramatik biçimde kısaltıyor. Uzun if-else zincirleri, açık cast'lar ve null kontrolleri artık tek satır ifadelere indirgeniyor. Bu makale, C# pattern matching'in tüm varyantlarını karşılaştırmalı örneklerle anlatıyor.
Switch Expression: Temel Sözdizimi
C# 8 öncesi switch statement ile C# 8+ switch expression karşılaştırması:
// CSHARP //
// Eski yol — verbosestring GetStatusText(OrderStatus status){ switch (status) { case OrderStatus.Pending: return "Beklemede"; case OrderStatus.Processing: return "İşleniyor"; case OrderStatus.Shipped: return "Kargoda"; case OrderStatus.Delivered: return "Teslim Edildi"; default: return "Bilinmiyor"; }}// C# 8+ — switch expressionstring GetStatusText(OrderStatus status) => status switch{ OrderStatus.Pending => "Beklemede", OrderStatus.Processing => "İşleniyor", OrderStatus.Shipped => "Kargoda", OrderStatus.Delivered => "Teslim Edildi", _ => "Bilinmiyor",};
Type Pattern
// CSHARP //
// Eski yoldouble GetArea(Shape shape){ if (shape is Circle c) return Math.PI * c.Radius * c.Radius; if (shape is Rectangle r) return r.Width * r.Height; if (shape is Triangle t) return 0.5 * t.Base * t.Height; throw new ArgumentException("Bilinmeyen şekil");}// Type pattern iledouble GetArea(Shape shape) => shape switch{ Circle c => Math.PI * c.Radius * c.Radius, Rectangle r => r.Width * r.Height, Triangle t => 0.5 * t.Base * t.Height, _ => throw new ArgumentException($"Bilinmeyen şekil: {shape.GetType().Name}"),};
// is ile type ve property patternobject obj = GetValue();if (obj is string { Length: > 0 } str) Console.WriteLine($"String: {str}");if (obj is List<int> { Count: >= 3 } list) Console.WriteLine($"Liste, {list.Count} eleman");// when guard — switch içinde ek koşulstring Classify(int n) => n switch{ 0 => "Sıfır", < 0 => "Negatif", var x when x % 2 == 0 => $"Çift: {x}", var x => $"Tek: {x}",};
Performans ve Derleme
Derleyici, switch expression'ları karmaşık bir karar ağacına dönüştürür. Basit enum switch'ler jump table (O(1)) olarak derlenir; type pattern'lar is kontrol zinciri olarak. Pattern exhaustiveness (tüm durumların kapsanması) derleme zamanında kontrol edilir — _ eklemezsen uyarı alırsın.
// CSHARP //
// Exhaustive pattern — compiler tüm enum değerlerini kontrol eder// Yeni enum değeri eklenirse derleme uyarısı/hatası alırsınstring GetName(DayOfWeek day) => day switch{ DayOfWeek.Monday => "Pazartesi", DayOfWeek.Tuesday => "Salı", DayOfWeek.Wednesday => "Çarşamba", DayOfWeek.Thursday => "Perşembe", DayOfWeek.Friday => "Cuma", DayOfWeek.Saturday => "Cumartesi", DayOfWeek.Sunday => "Pazar", // _ yok — eksik enum varsa CS8509 uyarısı};
Özet
C# pattern matching; switch expression (C# 8), property pattern, relational pattern (C# 9) ve list pattern (C# 11) katmanlarıyla gelişti. Temel kural: is null kontrolü + type check için, switch expression koşul dallanması için, property pattern veri sınıflarını deconstruct etmek için kullanılır. Null'a karşı { } not-null pattern ve when guard ile neredeyse tüm koşullu mantık tek expression'a sığar.