In Visual Basic stelt de implementatie van de IDisposable-interface (het Dispose-patroon) je in staat om middelen (zoals bestanden, databaseverbindingen, grafische objecten) correct vrij te geven die niet door de garbage collector worden beheerd.
Een typische implementatie is als volgt:
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
Belangrijk: Gebruik de constructie Using ... End Using — dit garandeert dat Dispose automatisch wordt aangeroepen:
Using manager As New FileManager("data.txt") ' bestand bewerkingen End Using
Nuances:
Vraag: "Waarom is de aanroep van GC.SuppressFinalize(Me) binnen de Dispose-methode nodig?"
Correct antwoord: Het vertelt de garbage collector dat de finalizer (Finalizer) niet hoeft te worden aangeroepen, aangezien de middelen al handmatig zijn vrijgegeven via Dispose. Zonder dit zal de finalizer onnodig worden uitgevoerd, wat de prestaties kan verlagen en kan leiden tot dubbele opruiming.
Verhaal
In banksoftware is IDisposable onjuist geïmplementeerd — ze vergaten Dispose aan te roepen voor de database, wat leidde tot lekkages van verbindingen. Gemiddeld "bevroor" de applicatie na 2–3 dagen ononderbroken werking.
Verhaal
In een medische dienst was Dispose verkeerd geïmplementeerd (de flag "disposed" ontbrak). De Dispose-methode werd meerdere keren achtereenvolgens aangeroepen, wat leidde tot pogingen om dezelfde middelen opnieuw vrij te geven en het optreden van uitzonderingen.
Verhaal
In een grafische editor vergaten ze GC.SuppressFinalize(Me) aan te roepen. De finalizer werd uitgevoerd zelfs na Dispose, wat leidde tot dubbele opruiming van middelen en instabiliteit (toegangsblokkering).