Using ステートメント (Visual Basic)Using Statement (Visual Basic)

始まりを宣言、Usingをブロックし、必要に応じてブロックを制御するシステム リソースを取得します。Declares the beginning of a Using block and optionally acquires the system resources that the block controls.


Using { resourcelist | resourceexpression }  
    [ statements ]  
End Using  


用語Term 定義Definition
resourcelist 指定しないかどうかに必要なresourceexpressionします。Required if you do not supply resourceexpression. この 1 つまたは複数のシステム リソースの一覧表示Usingコントロール、コンマで区切ってをブロックします。List of one or more system resources that this Using block controls, separated by commas.
resourceexpression 指定しないかどうかに必要なresourcelistします。Required if you do not supply resourcelist. 参照変数またはこので制御するシステム リソースを参照する式Usingブロックします。Reference variable or expression referring to a system resource to be controlled by this Using block.
statements 任意。Optional. ステートメントのブロックをUsingブロックが実行されます。Block of statements that the Using block runs.
End Using 必須。Required. 定義を終了、Usingブロックおよびそれによって制御されるすべてのリソースを破棄します。Terminates the definition of the Using block and disposes of all the resources that it controls.

内の各リソース、resourcelist部分は、次の構文とパーツ。Each resource in the resourcelist part has the following syntax and parts:

resourcename As New resourcetype [ ( [ arglist ] ) ]

- または --or-

resourcename As resourcetype = resourceexpression

resourcelist 部分resourcelist Parts

用語Term 定義Definition
resourcename 必須。Required. システム リソースを参照する参照変数をUsingコントロールをブロックします。Reference variable that refers to a system resource that the Using block controls.
New 必要な場合、Usingステートメントがリソースを取得します。Required if the Using statement acquires the resource. リソースを既に取得した場合は、2 番目の構文を使用します。If you have already acquired the resource, use the second syntax alternative.
resourcetype 必須。Required. リソースのクラスです。The class of the resource. このクラスを実装する必要があります、IDisposableインターフェイスです。The class must implement the IDisposable interface.
arglist 任意。Optional. インスタンスを作成するコンス トラクターに渡す引数のリストresourcetypeです。List of arguments you are passing to the constructor to create an instance of resourcetype. 参照してくださいパラメーター リストです。See Parameter List.
resourceexpression 必須。Required. 変数または式の要件を満たすシステム リソースを参照するresourcetypeです。Variable or expression referring to a system resource satisfying the requirements of resourcetype. 2 番目の構文を使用する場合は、制御を渡す前に、リソースを取得する必要があります、Usingステートメントです。If you use the second syntax alternative, you must acquire the resource before passing control to the Using statement.


場合によって、コードでは、ファイル ハンドル、COM ラッパーの場合は、SQL 接続など、アンマネージ リソースが必要です。Sometimes your code requires an unmanaged resource, such as a file handle, a COM wrapper, or a SQL connection. AUsingブロックがそれらにコードが完了すると、そのような 1 つまたは複数のリソースの破棄を保証します。A Using block guarantees the disposal of one or more such resources when your code is finished with them. これによりを使用するには、他のコードで使用可能です。This makes them available for other code to use.

マネージ リソースが破棄、.NET Framework ガベージ コレクター (GC) によって、手動で追加のコーディングなし。Managed resources are disposed of by the .NET Framework garbage collector (GC) without any extra coding on your part. 必要としない、Usingマネージ リソースをブロックします。You do not need a Using block for managed resources. ただし、引き続き使用できます、Using強制的にガベージ コレクターを待つ代わりにマネージ リソースの破棄をブロックします。However, you can still use a Using block to force the disposal of a managed resource instead of waiting for the garbage collector.

AUsingブロックには 3 つの部分。 取得、使用状況、および破棄します。A Using block has three parts: acquisition, usage, and disposal.

  • 買収変数の作成と初期化、システムのリソースを参照することを意味します。Acquisition means creating a variable and initializing it to refer to the system resource. Usingステートメントが 1 つまたは複数のリソースを取得するか、ブロックに入る前にリソースを 1 つを取得してそれを指定する、Usingステートメントです。The Using statement can acquire one or more resources, or you can acquire exactly one resource before entering the block and supply it to the Using statement. 指定した場合resourceexpressionに制御を渡す前に、リソースを取得する必要があります、Usingステートメントです。If you supply resourceexpression, you must acquire the resource before passing control to the Using statement.

  • 使用状況リソースにアクセスし、それを使ってアクションを実行することを意味します。Usage means accessing the resources and performing actions with them. 間にあるステートメントUsingEnd Usingリソースの使用量を表します。The statements between Using and End Using represent the usage of the resources.

  • 廃棄を呼び出す方法、Disposeメソッド内のオブジェクトをresourcenameです。Disposal means calling the Dispose method on the object in resourcename. これにより、そのリソースを正常に終了するオブジェクト。This allows the object to cleanly terminate its resources. End Using下にあるリソースを破棄するステートメント、Usingブロックのコントロールです。The End Using statement disposes of the resources under the Using block's control.


AUsingブロックの動作と同様に、Tryしています.Finallyを構築、Tryブロックは、リソースを使用して、Finallyそれらのブロックを破棄します。A Using block behaves like a Try...Finally construction in which the Try block uses the resources and the Finally block disposes of them. このため、Usingブロック、ブロックを終了する方法に関係なく、リソースの破棄を保証します。Because of this, the Using block guarantees disposal of the resources, no matter how you exit the block. これは、未処理の例外を場合でも当てはまりますを除き、StackOverflowExceptionです。This is true even in the case of an unhandled exception, except for a StackOverflowException.

によって取得されたすべてのリソース変数のスコープ、Usingステートメントに制限されます、Usingブロックします。The scope of every resource variable acquired by the Using statement is limited to the Using block.

1 つ以上のシステム リソースを指定する場合、Usingを入れ子にする場合と同じステートメントでは、影響はUsing互いをブロックします。If you specify more than one system resource in the Using statement, the effect is the same as if you nested Using blocks one within another.

場合resourcenameNothing、呼び出しがありませんDisposeが行われると、例外はスローされません。If resourcename is Nothing, no call to Dispose is made, and no exception is thrown.

構造化例外処理を使用してブロック内Structured Exception Handling Within a Using Block

内で発生する可能性がある例外を処理する必要があるかどうか、Usingブロック、完全なを追加することができますTryしています.Finallyを構築します。If you need to handle an exception that might occur within the Using block, you can add a complete Try...Finally construction to it. ケースを処理する必要がある場合で、Usingステートメントが、リソースの取得中に失敗した、かどうかをテストできますresourcenameNothingします。If you need to handle the case where the Using statement is not successful in acquiring a resource, you can test to see if resourcename is Nothing.

構造化例外処理を使用してブロックではなくStructured Exception Handling Instead of a Using Block

場合は、リソースの取得をより細かく制御する必要がありますまたはでコードを追加する必要があります、Finallyブロックを書き直すことができます、Usingとしてブロック、Tryしています.Finally構築します。If you need finer control over the acquisition of the resources, or you need additional code in the Finally block, you can rewrite the Using block as a Try...Finally construction. 次の例では、スケルトンTryUsing買収や破棄が同じ構造resourceです。The following example shows skeleton Try and Using constructions that are equivalent in the acquisition and disposal of resource.

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  
    ' Insert code to work with resource.  
    If resource IsNot Nothing Then  
    End If  
End Try   


内のコード、Usingブロック内のオブジェクトを割り当てないでくださいresourcenameを別の変数です。The code inside the Using block should not assign the object in resourcename to another variable. 終了すると、Usingブロック、リソースが破棄され、他の変数が指すリソースにアクセスできません。When you exit the Using block, the resource is disposed, and the other variable cannot access the resource to which it points.


次の例では、log.txt は、ファイルに次の 2 つの行のテキストを書き込むファイルを作成します。The following example creates a file that is named log.txt and writes two lines of text to the file. 例もその同じファイルをテキストの行が表示されます。The example also reads that same file and displays the lines of text.

TextWriterTextReaderクラスで実装、IDisposableコードで使用できるインターフェイス、Usingステートメント ファイルの書き込みの後に閉じられたし、読み取り操作は正しくことを確認します。Because the TextWriter and TextReader classes implement the IDisposable interface, the code can use Using statements to ensure that the file is correctly closed after the write and read operations.

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
            line = reader.ReadLine()
    End Using
End Sub

関連項目See Also

Try...Catch...Finally ステートメントTry...Catch...Finally Statement
方法 : システム リソースを破棄するHow to: Dispose of a System Resource