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