Freigeben über


Using-Anweisung (Visual Basic)

Deklariert den Anfang eines Using Blocks und erwirbt optional die Systemressourcen, die der Block steuert.

Syntax

Using { resourcelist | resourceexpression }
    [ statements ]
End Using

Bestandteile

Begriff Definition
resourcelist Erforderlich, wenn Sie nicht angeben resourceexpression. Liste einer oder mehrerer Systemressourcen, die dieser Using Block steuert, getrennt durch Kommas.
resourceexpression Erforderlich, wenn Sie nicht angeben resourcelist. Referenzvariable oder Ausdruck, der auf eine Systemressource verweist, die von diesem Using Block gesteuert werden soll.
statements Wahlfrei. Block von Anweisungen, die der Using Block ausführt.
End Using Erforderlich. Beendet die Definition des Using Blocks und entfernt alle ressourcen, die von ihr gesteuert werden.

Jede Ressource im resourcelist Teil weist die folgende Syntax und Teile auf:

resourcename As New resourcetype [ ( [ arglist ] ) ]

-oder-

resourcename As resourcetype = resourceexpression

Ressourcenlistenteile

Begriff Definition
resourcename Erforderlich. Referenzvariable, die auf eine Systemressource verweist, die vom Using Block gesteuert wird.
New Erforderlich, wenn die Using Anweisung die Ressource erwirbt. Wenn Sie die Ressource bereits erworben haben, verwenden Sie die zweite Syntaxalternative.
resourcetype Erforderlich. Die Klasse der Ressource. Die Klasse muss die IDisposable Schnittstelle implementieren.
arglist Wahlfrei. Liste der Argumente, die Sie an den Konstruktor übergeben, um eine Instanz von resourcetype. Siehe Parameterliste.
resourceexpression Erforderlich. Variable oder Ausdruck, die auf eine Systemressource verweist, die die Anforderungen von resourcetype. 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 die Entsorgung einer oder mehrerer solcher Ressourcen, wenn Ihr Code mit ihnen fertig ist. Dadurch werden sie für andere Zu verwendende Code zur Verfügung gestellt.

Verwaltete Ressourcen werden vom .NET Framework Garbage Collector (GC) ohne zusätzliche Codierung auf Ihrem Teil verworfen. Sie benötigen Using keinen Block für verwaltete Ressourcen. Sie können jedoch weiterhin einen Using Block verwenden, um die Entsorgung einer verwalteten Ressource zu erzwingen, anstatt auf den Garbage Collector zu warten.

Ein Using Block hat drei Teile: Erwerb, Nutzung und Entsorgung.

  • Der Erwerb bedeutet, eine Variable zu erstellen und zu initialisieren, 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 der Using Anweisung bereitstellen. Wenn Sie angeben resourceexpression, müssen Sie die Ressource abrufen, bevor Sie die Steuerung an die Using Anweisung übergeben.

  • Die Verwendung bedeutet den Zugriff auf die Ressourcen und das Ausführen von Aktionen mit ihnen. Die Anweisungen zwischen Using und End Using stellen die Verwendung der Ressourcen dar.

  • Entsorgung bedeutet das Aufrufen der Dispose Methode für das Objekt in resourcename. Dadurch kann das Objekt seine Ressourcen sauber beenden. Die End Using Anweisung verworfen die Ressourcen unter dem Steuerelement des Using Blocks.

Verhalten

Ein Using Block verhält sich wie eine Try...Finally Konstruktion, in der der Try Block die Ressourcen und den Finally Block entfernt. Aus diesem Gründen garantiert der Block die Using Entsorgung der Ressourcen, unabhängig davon, wie Sie den Block verlassen. Dies gilt auch bei einer unbehandelten Ausnahme, mit Ausnahme eines StackOverflowException.

Der Umfang jeder von der Using Anweisung erworbenen Ressourcenvariablen ist auf den Using Block beschränkt.

Wenn Sie mehr als eine Systemressource in der Using Anweisung angeben, entspricht der Effekt dem, wenn Sie Blöcke miteinander verschachtelt haben Using .

Wenn resourcename ja Nothing, wird kein Aufruf Dispose ausgeführt, und es wird keine Ausnahme ausgelöst.

Strukturierte Ausnahmebehandlung in einem Using-Block

Wenn Sie eine Ausnahme behandeln müssen, die innerhalb des Using Blocks auftreten kann, können Sie eine vollständige Try...Finally Konstruktion hinzufügen. Wenn Sie den Fall behandeln müssen, in dem die Using Anweisung beim Abrufen einer Ressource nicht erfolgreich ist, können Sie testen, ob resourcename dies der Fall ist Nothing.

Strukturierte Ausnahmebehandlung anstelle eines using-Blocks

Wenn Sie eine genauere Kontrolle über den Erwerb der Ressourcen benötigen oder zusätzlichen Code im Finally Block benötigen, können Sie den Using Block als ... TryFinally -Konstruktion neu schreiben. Das folgende Beispiel zeigt Skelett Try - und Using Konstruktionen, die im Erwerb und der Entsorgung resourcegleichwertig 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 innerhalb des Using Blocks sollte das Objekt resourcename nicht einer anderen Variablen zuweisen. Wenn Sie den Using Block beenden, wird die Ressource verworfen, 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 zwei Textzeilen in die Datei geschrieben. Das Beispiel liest auch dieselbe Datei und zeigt die Textzeilen an:

Da die TextWriter Schnittstelle und TextReader klassen die IDisposable Schnittstelle implementieren, kann der Code Anweisungen verwenden Using , 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

Siehe auch