ProgramlamaGeliştirici .NET (masaüstü/web)

Visual Basic'de 'Dispose' (IDisposable) deseninin nasıl gerçekleştirildiği, neden kullanmanın önemli olduğu ve kaynaklarla çalışırken hangi inceliklerin olduğu nedir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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:

  • Eğer sınıfınız kaynakları yönetiyorsa, her zaman IDisposable'ı uygulayın.
  • Eğer sınıf miras alıyorsa, desen korumalı ve sanal (Overridable) olmalıdır, böylece miras alanlar kendi kaynaklarını temizleme ekleyebilir.
  • GC.SuppressFinalize(this/me) çağrısını unutmayın — bu, temizliğin çift çağrılmasını engeller.

Sürpriz Soru.

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.

Konuya dair bilgi eksikliğinden kaynaklanan gerçek hata örnekleri.


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ı.