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 die Using-Anweisung bereitstellen. Wenn Sie resourceexpression angeben, müssen Sie die Ressource abrufen, bevor Sie die Steuerung an die Using-Anweisung übergeben.

  • Nutzung bedeutet, dass auf die Ressourcen zugegriffen und Aktionen mit ihnen ausgeführt werden. Die Anweisungen zwischen Using und End 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. Die End Using-Anweisung gibt die Ressourcen unter der Steuerung des Using-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

Weitere Informationen