IDisposable Pattern: Modern.NET'te Hala Gerekli mi?
Yeni yazdığın sınıflar için IDisposable ekleme alışkanlığın nedir?
.NET'te kaynakları temizlemek için IDisposable kullanmak hemen hemen bir ayin haline geldi. Pek çok geliştirici bir sınıf yazdığında otomatik olarak IDisposable ekliyor, using ifadesini koyuyor ve geçiyor. Ama bu alışkanlık gerçekten her durumda gerekli mi, yoksa çoğu zaman boşuna mı yapıyoruz?
Her şeyden önce açık: IDisposable hala önemli. Dosya, veritabanı bağlantısı, network soketi, işletim sistemi handle'ı gibi yönetilmeyen kaynaklar varsa, mutlaka temizlenmeli. Garbage collector bu şeyleri bilmez. Burada IDisposable hayati.
Sorun başka yerde. Çoğu sınıf aslında yönetilmeyen kaynak tutmuyor. Sadece diğer nesneleri referans tutuyor. Bir veri modeli, bir servis sınıfı, bir DTO, bunlara IDisposable eklemek gereksiz karmaşıklık getiriyor. Garbage collector onları halleder. Ama geliştirici alışkanlığı yüzünden, hatta kimi IDE şablonları yüzünden, herkes bunu yapıyor.
Modern.NET'te durum biraz değişti. Nullable reference types, record'lar ve daha temiz API tasarımı, kötü kaynak yönetimini erkenden yakalamayı kolaylaştırıyor. Ayrıca using declaration (C# 8+) ve using statement sözdizimi, forget etme riskini azaltıyor.
Praktik sonuç: IDisposable'a ihtiyacın olup olmadığını sor. Eğer sınıfın yönetilmeyen kaynak tutuyorsa, dosya, bağlantı, timer, unmanaged bellek, ekle. Ama sadece veri taşıyorsa, kaynak temizlemeye gerek yok. Boşuna karmaşıklaştırma.
Bir diğer nokta: finalizer yazma. Finalizer'lar öngörülemeyen zamanda çalışır ve garbage collection'u yavaşlatabilir. Sadece yönetilmeyen kaynaklara doğrudan erişen sınıflarda gerekli. Çoğu durumda Dispose yeterli.
IDisposable ölmedi, ama her yere ihtiyacı yok. Bilinçli karar ver: kaynağın türü nedir, kim temizleyecek, gerçekten gerekli mi. Bunu sorgulamayan kod, teknik borç biriktiren koddur.
0 yorum