Using-Anweisung (Visual Basic)
Deklariert den Anfang eines Using
-Blocks und ruft optional die Systemressourcen ab, die der Block steuert.
Syntax
Using { resourcelist | resourceexpression }
[ statements ]
End Using
Bestandteile
Begriff | Definition |
---|---|
resourcelist |
Erforderlich, wenn Sie resourceexpression nicht angeben. Liste mit Systemressourcen, die dieser Using -Block steuert, getrennt durch Kommas |
resourceexpression |
Erforderlich, wenn Sie resourcelist nicht angeben. Verweisvariable oder Ausdruck, die bzw. der auf eine Systemressource verweist, die von diesem Using -Block gesteuert werden soll |
statements |
Optional. Block der Anweisungen, die vom Using -Block ausgeführt werden |
End Using |
Erforderlich. Beendet die Definition des Using -Blocks und gibt alle von ihm gesteuerten Ressourcen frei. |
Jede Ressource im Teil resourcelist
verfügt über folgende Syntax und Bestandteile:
resourcename As New resourcetype [ ( [ arglist ] ) ]
Oder
resourcename As resourcetype = resourceexpression
Bestandteile von resourcelist
Begriff | Definition |
---|---|
resourcename |
Erforderlich. Verweisvariable, die auf eine vom Using -Block gesteuerte Systemressource verweist |
New |
Erforderlich, wenn die Using -Anweisung die Ressource abruft. Wenn Sie die Ressource bereits abgerufen haben, verwenden Sie die zweite Syntaxalternative. |
resourcetype |
Erforderlich. Die Klasse der Ressource. Die Klasse muss die IDisposable-Schnittstelle implementieren. |
arglist |
Optional. Liste der Argumente, die Sie an den Konstruktor übergeben, um eine Instanz von resourcetype zu erstellen. Siehe Parameterliste (Visual Basic). |
resourceexpression |
Erforderlich. Variable oder Ausdruck, die bzw. der sich auf eine Systemressource bezieht, die die Anforderungen von resourcetype erfüllt. Wenn Sie die zweite Syntaxalternative verwenden, müssen Sie die Ressource abrufen, bevor Sie die Steuerung an die Using -Anweisung übergeben. |
Bemerkungen
Manchmal erfordert Ihr Code eine nicht verwaltete Ressource, z. B. ein Dateihandle, einen COM-Wrapper oder eine SQL-Verbindung. Ein Using
-Block garantiert, dass die Ressourcen freigegeben werden, wenn Ihr Code sie nicht mehr benötigt. Dadurch stehen sie für anderen Code zur Verfügung.
Verwaltete Ressourcen werden vom .NET Framework-Garbage Collector (GC) ohne zusätzliche Codierung Ihrerseits freigegeben. Sie benötigen keinen Using
-Block für verwaltete Ressourcen. Sie können jedoch einen Using
-Block verwenden, um die Freigabe einer verwalteten Ressource zu erzwingen, anstatt auf die Ausführung des Garbage Collectors zu warten.
Ein Using
-Block umfasst drei Teile: Abruf, Nutzung und Freigabe.
Abruf bedeutet, dass eine Variable erstellt und initialisiert wird, um auf die Systemressource zu verweisen. Die
Using
-Anweisung kann eine oder mehrere Ressourcen abrufen, oder Sie können genau eine Ressource abrufen, bevor Sie den Block eingeben und für dieUsing
-Anweisung bereitstellen. Wenn Sieresourceexpression
angeben, müssen Sie die Ressource abrufen, bevor Sie die Steuerung an dieUsing
-Anweisung übergeben.Nutzung bedeutet, dass auf die Ressourcen zugegriffen und Aktionen mit ihnen ausgeführt werden. Die Anweisungen zwischen
Using
undEnd Using
stellen die Nutzung der Ressourcen dar.Freigabe bedeutet, dass die Dispose-Methode für das Objekt in
resourcename
aufgerufen wird. Dadurch kann das Objekt seine Ressourcen sauber beenden. DieEnd Using
-Anweisung gibt die Ressourcen unter der Steuerung desUsing
-Blocks frei.
Verhalten
Ein Using
-Block verhält sich wie eine Konstruktion vom Typ Try
...Finally
, bei der der Try
-Block die Ressourcen verwendet und der Finally
-Block sie freigibt. Aus diesem Grund garantiert der Block Using
die Freigabe der Ressourcen, unabhängig davon, wie Sie den Block beenden. Dies gilt auch bei einem Ausnahmefehler, außer bei StackOverflowException.
Der Gültigkeitsbereich aller von der Using
-Anweisung abgerufenen Ressourcenvariablen ist auf den Using
-Block beschränkt.
Wenn Sie in der Using
-Anweisung mehrere Systemressourcen angeben, ist der Effekt derselbe wie beim Ineinanderschachteln von Using
-Blöcken.
Wenn Nothing
für resourcename
angegeben ist, wird Dispose nicht aufgerufen, und es wird keine Ausnahme ausgelöst.
Strukturierte Ausnahmebehandlung in einem Using-Block
Wenn Sie eine Ausnahme behandeln müssen, die möglicherweise innerhalb des Using
-Blocks auftritt, können Sie eine vollständige Konstruktion vom Typ Try
...Finally
hinzufügen. Wenn Sie den Fall behandeln müssen, dass die Using
-Anweisung beim Abrufen einer Ressource nicht erfolgreich ist, können Sie testen, ob Nothing
für resourcename
angegeben ist.
Strukturierte Ausnahmebehandlung anstelle eines Using-Blocks
Wenn Sie den Abruf der Ressourcen präziser steuern müssen oder zusätzlichen Code im Finally
-Block benötigen, können Sie den Using
-Block als Konstruktion vom Typ Try
...Finally
umschreiben. Das folgende Beispiel zeigt ein Gerüst für Try
- und Using
-Konstruktionen, die in Bezug auf den Abruf und die Freigabe von resource
gleichwertig sind.
Using resource As New resourceType
' Insert code to work with resource.
End Using
' For the acquisition and disposal of resource, the following
' Try construction is equivalent to the Using block.
Dim resource As New resourceType
Try
' Insert code to work with resource.
Finally
If resource IsNot Nothing Then
resource.Dispose()
End If
End Try
Hinweis
Der Code im Using
-Block sollte das Objekt in resourcename
nicht einer anderen Variablen zuweisen. Wenn Sie den Using
-Block beenden, wird die Ressource freigegeben, und die andere Variable kann nicht auf die Ressource zugreifen, auf die sie verweist.
Beispiel
Im folgenden Beispiel wird eine Datei mit dem Namen „log.txt“ erstellt, und es werden zwei Textzeilen in die Datei geschrieben. Das Beispiel liest auch dieselbe Datei und zeigt die Textzeilen an.
Da die Klassen TextWriter und TextReader die IDisposable-Schnittstelle implementieren, kann der Code Using
-Anweisungen verwenden, um sicherzustellen, dass die Datei nach den Schreib- und Lesevorgängen ordnungsgemäß geschlossen wird.
Private Sub WriteFile()
Using writer As System.IO.TextWriter = System.IO.File.CreateText("log.txt")
writer.WriteLine("This is line one.")
writer.WriteLine("This is line two.")
End Using
End Sub
Private Sub ReadFile()
Using reader As System.IO.TextReader = System.IO.File.OpenText("log.txt")
Dim line As String
line = reader.ReadLine()
Do Until line Is Nothing
Console.WriteLine(line)
line = reader.ReadLine()
Loop
End Using
End Sub