Furkan KapukayaYazılım geliştirme
C# ve .NET3 dk okuma

C# Pattern Matching: switch İfadeleri ve Desenlerle Okunabilir Kod

C# pattern matching özellikleri; is ve switch ifadeleri, tip, özellik, ilişkisel, mantıksal ve liste desenleri ile iş kurallarını daha kısa ve okunabilir yazma örnekleri.

Uzun if-else zincirleri ve iç içe tip kontrolleri, iş kurallarını okunmaz hale getirir. C#'ın her sürümle zenginleşen pattern matching (desen eşleme) özellikleri, bu tür kodu kısa, okunabilir ve derleyici tarafından denetlenen ifadelere dönüştürür.

is ile tip ve null kontrolü

if (odeme is KartliOdeme kart && kart.TaksitSayisi > 1)
{
    // kart değişkeni burada KartliOdeme tipinde
}

if (musteri is not null) { /* ... */ }

is not null, operatör aşırı yüklemelerinden etkilenmeyen güvenli bir null kontrolüdür. Null güvenliği için bkz. nullable reference types.

switch ifadesi

decimal KargoUcreti(Siparis s) => s switch
{
    { Tutar: >= 1500 }                      => 0m,
    { TeslimatTipi: Teslimat.Ayni_Gun }     => 149m,
    { Agirlik: > 30 }                        => 199m,
    _                                        => 79m
};

Her satır bir kuralı anlatır ve sıra önemlidir: ilk eşleşen kazanır. _ varsayılan durumdur.

Desen türleri

DesenÖrnekAnlamı
TipKartliOdeme kBelirli tipte ise
Sabit"TR"Değer eşitse
İlişkisel> 100, <= 0Karşılaştırma
Mantıksal>= 18 and < 65, not nullDesenleri birleştirme
Özellik{ Ulke: "TR", Il: "İstanbul" }Özelliklere göre
Konum(0, 0)Deconstruct ile
Liste[var ilk, .., var son]Dizi ve liste yapısına göre

Gerçekçi bir örnek: İndirim kuralı

decimal IndirimOrani(Musteri m, Sepet sepet) => (m, sepet) switch
{
    ({ Tip: MusteriTipi.Bayi }, _)                  => 0.15m,
    ({ SiparisSayisi: >= 10 }, { Tutar: > 5000 })   => 0.10m,
    (_, { Tutar: > 5000 })                           => 0.05m,
    _                                                => 0m
};

Aynı mantık if-else ile yazıldığında iki kat uzar ve kuralların önceliği gözden kaçabilir.

Liste desenleri

string Ozet(int[] puanlar) => puanlar switch
{
    []              => "Henüz puan yok",
    [var tek]       => $"Tek puan: {tek}",
    [var ilk, .., var son] => $"İlk {ilk}, son {son}"
};

Komut satırı argümanlarını veya dosyadan okunan satırları ayrıştırırken çok kullanışlıdır.

Derleyici güvencesi

Bir enum veya kapalı tip hiyerarşisi üzerinde switch ifadesi yazdığınızda, tüm durumları ele almazsanız derleyici uyarı verir. Yeni bir sipariş durumu eklendiğinde, ele alınmayan her yer derleme sırasında ortaya çıkar. Bu, record tipleriyle birlikte kullanıldığında özellikle güçlüdür.

Ne zaman kullanmamalı?

  • Çok karmaşık desenler tek satıra sıkıştırıldığında okunabilirlik kaybolur.
  • Kurallar sık değişiyor ve veritabanından yönetilmesi gerekiyorsa koda gömmek yerine yapılandırma veya Strategy deseni daha uygundur.

Sık sorulan sorular

Pattern matching performanslı mı?

Evet. Derleyici desenleri verimli koda dönüştürür; çoğu durumda elle yazılmış if-else ile aynı veya daha iyi performans gösterir.

Eski C# sürümlerinde kullanılabilir mi?

Temel is desenleri C# 7'den, switch ifadeleri C# 8'den, liste desenleri C# 11'den itibaren kullanılabilir. Modern .NET sürümleriyle hepsi hazırdır.

Sonuç

Pattern matching, iş kurallarını kodda bir tablo gibi okunur hale getirir. Ölçülü kullanıldığında hem hata ihtimalini azaltır hem de değişiklikleri kolaylaştırır.