Objekte, die es gestatten, sich auf die Entsorgung hinweisen zu lassen, implementieren eine Methode namens Dispose (etwa: entsorgen) – das haben Sie in diesem Kapitel bereits kennen gelernt. Rufen Sie Dispose eines Objekts auf, gibt es alle belegten Systemressourcen frei und signalisiert dem Garbage Collector gleichzeitig, dass er es »mitnehmen« kann. Wir wissen, wie wir ein solches Muster in eigenen Klassen implementieren, aber wie wenden wir das idealerweise an?
Eine typische Vorgehensweise zur Anwendung sieht so aus, wie es das folgende Beispiellisting demonstriert, das einen einfachen Text in eine Datei schreibt:
Dim locSw As StreamWriter
Try
locSw = New StreamWriter("C:\Textdatei1.txt")
Try
locSw.WriteLine("Erste Textzeile")
locSw.WriteLine("Zweite Textzeile")
'Schreibpuffer leeren
locSw.Flush()
Catch ex As Exception
Debug.Print("Fehler beim Schreiben der Datei!")
Finally
'Alle Systemressourcen wieder freigeben
locSw.Dispose()
End Try
Catch ex As Exception
Debug.Print("Fehler beim Öffnen der Datei!")
End Try
Weil das Freigeben der belegten Systemressourcen in diesem Fall so wichtig ist, befindet sich der Aufruf der Dispose-Methode in diesem Fall im Finally-Teil des Try/Catch-Blocks. Dadurch wird sichergestellt, dass die Systemressourcen des Objekts in jedem Fall freigegeben werden, egal ob es innerhalb des Try-Teils zu einer Ausnahme kam oder nicht.
Hinweis: Zwei geschachtelte Try-Blöcke sind hier übrigens sinnvoll, weil beim Öffnen der Datei andere Ausnahmen auftreten können als beim Schreiben. Die Systemressourcen selbst werden aber nur nach erfolgreichem Öffnen des StreamWriter-Objekts von diesem belegt und müssen deswegen auch nur in diesem Fall (innerer Try/Catch-Block) mit Dispose wieder freigegeben werden.
Using erlaubt nun, die Lebensdauer eines Objekts, das die Dispose-Methodik implementiert, gezielt zu steuern. Das folgende Beispiellisting entspricht dem obigen Beispiel im Detail – Using vereinfacht aber den Umgang mit dem Objekt, und der Code wird leichter lesbar:
'Schreiben einer Datei - mit Using wird die Lebensdauer von locSw2 gesteuert
Try
'Alternativ ginge auch die Weiterverwendung von locSw:
'locSw = New StreamWriter("C:\Textdatei2.txt")
'Using locSw
Using locSw2 As New StreamWriter("C:\Textdatei2.txt")
Try
locSw2.WriteLine("Erste Textzeile")
locSw2.WriteLine("Zweite Textzeile")
'Schreibpuffer leeren
locSw2.Flush()
Catch ex As Exception
Debug.Print("Fehler beim Schreiben der Datei!")
End Try
'Hier wird automatisch locSw.Dispose durchgeführt
End Using
Catch ex As Exception
Debug.Print("Fehler beim Öffnen der Datei!")
End Try
Sie sehen hier, dass der Finally-Teil des inneren Try/Catch-Blocks überflüssig geworden ist – denn am End Using kommt das Programm nicht vorbei. Selbst, wenn es versuchen würde, beispielsweise mit Return aus dem Using-Block herauszuspringen, würde die Dispose-Methode des Objekts dennoch vor dem eigentlichen Verlassen der Prozedur noch ausgeführt.
Tipp: Using wird besonders häufig bei Verbindungen zu Microsoft SQL Server eingesetzt. Sobald Sie eine Verbindung zu Microsoft SQL Server benötigen, verwenden Sie das dazu erforderliche Connection-Objekt innerhalb einer Using-Anweisung. Führen Sie alle Operationen durch, für die Sie eine offene Verbindung benötigen. Am Ende aller Operationen schließen Sie die SQL Server-Verbindung mit End Using. Auf diese Weise können Sie auch gefahrlos einen solchen Codeblock verlassen, ohne explizit dafür Sorge getragen haben zu müssen, die Verbindung zu SQL Server wieder zu schließen. Zusätzlich zum Schließen der Verbindung, was auch die Methode Close() leisten könnte, wird in Dispose() auch der Shared Lock in der benutzten Datenbank entfernt. Ihre Anwendung wird dadurch robuster. Denn Sie vermeiden doppelt oder mehrfach offene Verbindungen, etwa weil Sie schlicht vergessen haben, eine offene Verbindung wieder zu schließen, nachdem Sie einen Codeblock, in dem SQL-Operationen verarbeitet wurden, vorzeitig verlassen haben.
Mehr zu diesem Thema in: Visual Basic 2010 das Entwicklerbuch von Klaus Löffelmann, erhältlich bei Amazon auch auf Englisch, und bei Microsoft Press. Möchten Sie Klaus Löffelmann oder das ActiveDevelop-Team für professionelle Software-Entwicklungsprojekte (Migration, C#, Visual Basic.NET) buchen, informieren Sie sich auf www.activedevelop.de
klauslo am 05. Dezember 2011
d2b23a23-56a0-49fd-becc-b237030baff4|0|.0
Tags: |
Categories: Garbage Collector