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

Using ブロックの開始を宣言し、オプションでこのブロックが制御するシステム リソースを取得します。

Using { resourcelist | resourceexpression }
    [ statements ]
End Using

指定項目

語句

定義

resourcelist

resourceexpression を指定しない場合は必ず指定します。コンマで区切られた一つ以上のシステム リソースのリスト Using のこのブロックが制御する。

resourceexpression

resourcelist を指定しない場合は必ず指定します。この Using ブロックによって制御されるシステム リソースを参照する参照変数または式です。

statements

省略可能。Using ブロックが実行するステートメントのブロックです。

End Using

必須。Using ブロックの定義を終了し、制御しているすべてのリソースを破棄します。

resourcelist 部分のリソースは、次の構文と指定項目で指定します。

resourcename As New resourcetype [ ( [ arglist ] ) ]

または

resourcename As resourcetype = resourceexpression

resourcelist の指定項目

語句

定義

resourcename

必須。Using ブロックが制御するシステム リソースを参照する参照変数です。

New

Using ステートメントがリソースを取得する場合は、必ず指定します。リソースを既に取得している場合は、2 つ目の構文を使用してください。

resourcetype

必須。リソースのクラス。このクラスは、IDisposable インターフェイスを実装する必要があります。

arglist

省略可能。resourcetype のインスタンスを作成するために、コンストラクターに渡す引数のリストです。「パラメーターの一覧 (Visual Basic)」を参照してください。

resourceexpression

必須。resourcetype の要件を満たすシステム リソースを参照する変数または式です。2 番目の構文を使用する場合は、制御を Using ステートメントに渡す前にリソースを取得する必要があります。

解説

ファイル ハンドル、COM ラッパー、SQL 接続などのアンマネージ リソースを取得するコードを作成する場合があります。そのようなコードに Using ブロックを使用すると、リソースを使い終わったとき、その 1 つ以上のリソースを確実に破棄できます。これにより、他のコードからそれらのリソースを使うことが可能になります。

マネージ リソースであれば、何もコードを追加しなくても、.NET Framework のガベージ コレクター (GC) が破棄してくれます。マネージ リソースに Using ブロックは必要ありません。ただし、Using ブロックを使用して、ガベージ コレクターを待たずに、マネージ リソースの破棄を強制することはできます。

Using ブロックは、取得、使用、破棄という 3 つの部分で構成されます。

  • 取得システム リソースを参照するための変数を作成、および初期化します。Using ステートメントでは 1 つ以上のリソースを取得することも、ブロックに入る前にリソースを 1 つ取得して、それを Using ステートメントに指定することもできます。resourceexpression を指定する場合は、制御を Using ステートメントに渡す前にリソースを取得する必要があります。

  • 使用リソースにアクセスし、それを使って処理を実行します。リソースを使用するステートメントは、Using と End Using の間に記述します。

  • 破棄resourcename に指定されたオブジェクトから Dispose メソッドを呼び出します。これによって、オブジェクトはリソースを適切に終了させることができます。End Using ステートメントはリソースを Using ブロックの制御に基づいて破棄します。

[動作]

Using ブロックは Try...Finally 構造 (Try でリソースを使用し、Finally ブロックでリソースを破棄する) と同様に動作します。このため、Using ブロックを使えば、ブロックがどのように終了した場合でも、リソースは必ず破棄されます。これは、StackOverflowException を除く未処理の例外の場合にも該当します。

Using ステートメントによって取得されるリソース変数のスコープは、必ず Using ブロックに制限されます。

Using ステートメントで 1 つ以上のシステム リソースを指定すると、Using ブロックを入れ子にするのと同じ意味になります。

resourcename が Nothing場合、Dispose の呼び出しは行われず、例外はスローされません。

Using ブロック内の構造化例外処理

Using ブロック内で起きる可能性のある例外を処理することが必要な場合は、ブロック内に Try...Finally 構造全体を追加してください。Using ステートメントがリソースの取得に失敗するケースに対応する必要がある場合は、resourcename が Nothing であるかどうかをテストします。

Using ブロック以外での構造化例外処理

リソースの取得を細かく制御する必要がある場合、または Finally ブロックにコードを追加する必要がある場合は、Using ブロックを Try...Finally 構造に書き換えてください。次に示すスケルトンは、どちらも resource の取得と破棄の処理を実行する Try 構造と Using 構造の例です。

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 

[!メモ]

Using ブロック内のコードで、resourcename に含まれるオブジェクトを別の変数に割り当てることはできません。Using ブロックの終了時にリソースが破棄され、他の変数は自分がポイントしているリソースにアクセスできなくなります。

使用例

次の例は、log.txtという作成して2行のテキストをファイルに書き込みます。この例では、と同じファイルを読み取り、行のテキストが表示されます。

TextWriterTextReader のクラスが IDisposable のインターフェイスを実装するため、コードは、ファイルが読み取りおよび書き込み操作の後で正しく閉じるように Using のステートメントを使用できます。

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

参照

処理手順

方法: システム リソースを破棄する (Visual Basic)

関連項目

IDisposable

Try...Catch...Finally ステートメント (Visual Basic)