C# 15'te kapalı hierarşiler: derleyici switch'lerin tamlığını denetler
C# 15 ile gelen closed modifier'ı, bir temel sınıfın alt tiplerinin yalnızca kendi assembly'sinde tanımlanabilmesini sağlıyor. Böylece derleyici, bu tipler üzerindeki switch ifadelerinin tüm durumları kapsayıp kapsamadığını kontrol edebiliyor. Yeni bir alt tip eklendiğinde sessizce çalışmayan kodun yerine derleme hatası almak isteyen .NET geliştiricileri için pratik bir yaklaşım.
Kilit noktalar
- Temel tipe closed eklenir; closed tipler zaten örtük olarak abstract'tır ve abstract ile birlikte yazılamaz.
- Yalnızca aynı assembly alt tip tanımlayabilir; dış assembly'den türetme CS9382 hatası verir.
- Switch ifadelerinde _ => kolu kaldırılabilir ve yeni alt tip eklenince derleme başarısız olur.
- Switch statement'lar bu denetimin dışındadır; tamlık kontrolü için switch expression kullanılmalıdır.
- Alt tipleri sealed yapmak sınırı korur; açık bir doğrudan alt tip sınırı delebilir.
- Özellik C# 15 gerektirir; C# 14 projelerinde CS9327 hatası alınır.
Bu yazı, C# 15 ve .NET 11 RC1 ile gelen closed hierarşilerini bir oyun örneği üzerinden anlatıyor. Açık bir temel sınıfa yeni bir alt tip eklendiğinde, eski switch ifadeleri için bırakılan catch-all kolu yeni durumu sessizce yakalayabiliyor ve derleyici uyarı vermiyor. Closed anahtar kelimesi bu boşluğu kapatıyor: temel tipin alt tipleri aynı assembly içinde olmak zorunda, derleyici de tam listeyi bildiği için switch ifadelerinin tamlığını kontrol edebiliyor.
Yazar, closed tipin abstract olarak işaretlenemeyeceğini, closed interface'in desteklenmediğini ve modülerliğin sınırının assembly olduğunu belirtiyor. Alt tiplerin sealed olması öneriliyor, çünkü açık bir alt tip sınırın dışına kapı açıyor. Ayrıca bir union sonucu ile closed hierarşinin birlikte nasıl kullanılabileceği de gösteriliyor. Ayrıntılı kod örnekleri için orijinal yazıya bakmak faydalı olacaktır.
Gerçek dünyada kullanımı
- Domain modelinde sabit bir kural kümesi olan bir oyun ya da iş akışı motoru, yeni kural eklendiğinde tüm kontrol noktalarının derleme hatasıyla bulunması.
- Bir sipariş durumu ya da ödeme sonucu hiyerarşisi gibi, yalnızca kendi çözümünüzün sahip olduğu ve tam listesi bilinen tipler.
Neden önemli
Açık bir temel sınıfa eklenen yeni alt tip, catch-all kolu yüzünden sessizce yanlış davranabilir. closed ile bu hata derleme aşamasında yakalanır, ancak tipin yalnızca kendi assembly'nizde genişletilebildiğini unutmamak gerekir.