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 ステートメントに制御を渡す前にリソースを取得する必要があります。 |
注釈
コードで、ファイル ハンドル、COM ラッパー、SQL 接続などのアンマネージ リソースが必要な場合があります。
Using ブロックは、コードが終了したときに、このようなリソースを 1 つ以上破棄することを保証します。 これにより、他のコードで使用できるようになります。
マネージド リソースは.NET Framework ガベージ コレクター (GC) によって破棄され、追加のコーディングは行いません。 マネージド リソースに Using ブロックは必要ありません。 ただし、ガベージ コレクターを待機するのではなく、 Using ブロックを使用してマネージド リソースを強制的に破棄することはできます。
Using ブロックには、取得、使用、破棄の 3 つの部分があります。
取得 とは、変数を作成し、それを初期化してシステム リソースを参照することを意味します。
Usingステートメントでは、1 つ以上のリソースを取得することも、ブロックを入力してUsingステートメントに指定する前に、1 つのリソースを正確に取得することもできます。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