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

@No__t 0 ブロックの先頭を宣言し、必要に応じて、ブロックが制御するシステムリソースを取得します。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 @No__t-0 を指定しない場合は必須です。Required if you do not supply resourceexpression. この @no__t によって制御される1つ以上のシステムリソースのリスト (コンマ区切り)。List of one or more system resources that this Using block controls, separated by commas.
resourceexpression @No__t-0 を指定しない場合は必須です。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. @No__t 0 ブロックによって実行されるステートメントのブロック。Block of statements that the Using block runs.
End Using 必須。Required. @No__t 0 ブロックの定義を終了し、制御しているすべてのリソースを破棄します。Terminates the definition of the Using block and disposes of all the resources that it controls.

@No__t-0 部分の各リソースには、次の構文と部分があります。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. @No__t 0 ブロックで制御されるシステムリソースを参照する参照変数。Reference variable that refers to a system resource that the Using block controls.
New @No__t-0 ステートメントでリソースが取得される場合は必須です。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. のインスタンスを作成するためにコンストラクターに渡す引数のリスト resourcetypeList of arguments you are passing to the constructor to create an instance of resourcetype. パラメーターリスト」を参照してください。See Parameter List.
resourceexpression 必須。Required. @No__t-0 の要件を満たすシステムリソースを参照する変数または式。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. @No__t-0 ブロックを使用すると、コードが終了したときに、そのようなリソースが確実に破棄されます。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.

@No__t 0 のブロックには、取得、使用、および破棄という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. @No__t 0 のステートメントは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. @No__t-0 を指定する場合は、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. @No__t-0 と End Using の間のステートメントは、リソースの使用状況を表します。The statements between Using and End Using represent the usage of the resources.

  • 破棄とは、resourcename でオブジェクトの Dispose メソッドを呼び出すことを意味します。Disposal means calling the Dispose method on the object in resourcename. これにより、オブジェクトはリソースを完全に終了できます。This allows the object to cleanly terminate its resources. @No__t-0 ステートメントは、Using ブロックのコントロールの下にあるリソースを破棄します。The End Using statement disposes of the resources under the Using block's control.


@No__t 0 のブロックは、Try... Finally の構造のように動作します。この構築では、@no__t 3 ブロックがリソースを使用し、@no__t 4 ブロックがそれらを破棄します。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.

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

@No__t-0 ステートメントで複数のシステムリソースを指定した場合、その効果は、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.

@No__t-0 が Nothing の場合、Dispose の呼び出しは行われず、例外はスローされません。If resourcename is Nothing, no call to Dispose is made, and no exception is thrown.

Using ブロック内での構造化例外処理Structured Exception Handling Within a Using Block

@No__t-0 ブロック内で発生する可能性のある例外を処理する必要がある場合は、完全な 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. @No__t-0 ステートメントがリソースの取得に失敗した場合に対処する必要がある場合は、resourcename が @no__t かどうかをテストして確認できます。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.

Using ブロックの代わりに構造化例外処理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. 次の例は、resource の取得と破棄に相当するスケルトン Try および @no__t の構造を示しています。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


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


次の例では、test.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:

@No__t-0 および TextReader クラスは 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