Using ステートメント (Visual Basic)
Using
ブロックの開始を宣言し、必要に応じて、ブロックで制御するシステム リソースを取得します。
構文
Using { resourcelist | resourceexpression }
[ statements ]
End Using
指定項目
用語 | 定義 |
---|---|
resourcelist |
resourceexpression を指定しない場合は必須です。 この Using ブロックで制御する、コンマで区切られた 1 つまたは複数のシステム リソースの一覧。 |
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 のインスタンスを作成するためにコンストラクターに渡す引数の一覧。 「パラメーター リスト」を参照してください。 |
resourceexpression |
必須です。 resourcetype の要件を満たすシステム リソースを参照する変数または式。 2 番目の代替構文を使用する場合は、Using ステートメントに制御を渡す前にリソースを取得する必要があります。 |
Remarks
コードに、ファイル ハンドル、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
ステートメントで複数のシステム リソースを指定した場合、その効果は、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
関連項目
.NET