Using ステートメント (Visual Basic)
更新 : 2007 年 11 月
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 ブロックは、取得、使用、破棄という 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 ブロックを入れ子にするのと同じ意味になります。
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
' THE FOLLOWING TRY CONSTRUCTION IS EQUIVALENT TO THE USING BLOCK
Dim resource As New resourceType
Try
' Insert code to work with resource.
Catch ex As Exception
' Insert code to process exception.
Finally
' Insert code to do additional processing before disposing of resource.
resource.Dispose()End Try
メモ : |
---|
Using ブロック内のコードで、resourcename に含まれるオブジェクトを別の変数に割り当てることはできません。Using ブロックの終了時にリソースが破棄され、他の変数は自分がポイントしているリソースにアクセスできなくなります。 |
使用例
次の例は Using ブロックを使用して新しいフォントを取得します。ブロックが終了したとき、必ずシステムによって Dispose メソッドがフォント上で呼び出されます。
Public Sub setbigbold(ByVal c As Control)
Using nf As New System.Drawing.Font("Arial", 12.0F, _
System.Drawing.FontStyle.Bold)
c.Font = nf
c.Text = "This is 12-point Arial bold"
End Using
End Sub