Visual Basic'de IDisposable arayüzünün (Dispose deseni) uygulanması, çöp toplayıcı tarafından yönetilmeyen kaynakların (örneğin dosyalar, veritabanı bağlantıları, grafik nesneleri) düzgün bir şekilde serbest bırakılmasını sağlar.
Tipik uygulama şudur:
Public Class FileManager Implements IDisposable Private fileStream As FileStream Private disposed As Boolean = False Public Sub New(path As String) fileStream = New FileStream(path, FileMode.Open) End Sub Public Sub Dispose() Implements IDisposable.Dispose Dispose(True) GC.SuppressFinalize(Me) End Sub Protected Overridable Sub Dispose(disposing As Boolean) If Not disposed Then If disposing AndAlso fileStream IsNot Nothing Then fileStream.Dispose() End If disposed = True End If End Sub Protected Overrides Sub Finalize() Dispose(False) MyBase.Finalize() End Sub End Class
Önemli: Using ... End Using yapısını kullanın — bu, Dispose çağrısının otomatik olarak yapılmasını garantiler:
Using manager As New FileManager("data.txt") ' dosya ile işlemler End Using
İnce noktalar:
Soru: "Dispose metodunun içinde GC.SuppressFinalize(Me) çağrısı neden gereklidir?"
Doğru cevap: Bu, çöp toplayıcıya finalizer'ın (Finalizer) çağrılmasına gerek olmadığını bildirir, çünkü kaynaklar zaten Dispose aracılığıyla manuel olarak temizlenmiştir. Bunu yapmazsanız, finalizer gereksiz bir şekilde çalışır, bu da performansı düşürür ve potansiyel olarak kaynakların çift temizlenmesine yol açabilir.
Hikaye
Bankacılık yazılımında IDisposable yanlış uygulanmış — veritabanında Dispose çağrısı yapılmadığı için bağlantı sızıntısına neden olmuştur. Ortalama uygulama 2-3 günlük kesintisiz çalışmadan sonra "takılmaya" başlamıştır.
Hikaye
Tıbbi hizmette Dispose yanlış uygulanmış ("disposed" bayrağı yoktu). Dispose metodu ardışık olarak birçok kez çağrılmış, bu da aynı kaynağın tekrar serbest bırakılmaya çalışılmasına ve istisnaların ortaya çıkmasına neden olmuştur.
Hikaye
Grafik editöründe GC.SuppressFinalize(Me) çağrısını unuttular. Finalizer, Dispose'dan sonra bile çalıştı, bu da kaynakların çift temizlenmesine ve kararsızlığa (erişim ihlali) yol açtı.