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行のテキストをファイルに書き込みます。この例では、と同じファイルを読み取り、行のテキストが表示されます。
TextWriter と TextReader のクラスが 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)