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 | Örnek | Anlamı |
|---|---|---|
| Tip | KartliOdeme k | Belirli tipte ise |
| Sabit | "TR" | Değer eşitse |
| İlişkisel | > 100, <= 0 | Karşılaştırma |
| Mantıksal | >= 18 and < 65, not null | Desenleri 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.