次の方法で共有


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 ステートメントに制御を渡す前にリソースを取得する必要があります。

注釈

コードで、ファイル ハンドル、COM ラッパー、SQL 接続などのアンマネージ リソースが必要な場合があります。 Using ブロックは、コードが終了したときに、このようなリソースを 1 つ以上破棄することを保証します。 これにより、他のコードで使用できるようになります。

マネージド リソースは.NET Framework ガベージ コレクター (GC) によって破棄され、追加のコーディングは行いません。 マネージド リソースに Using ブロックは必要ありません。 ただし、ガベージ コレクターを待機するのではなく、 Using ブロックを使用してマネージド リソースを強制的に破棄することはできます。

Using ブロックには、取得、使用、破棄の 3 つの部分があります。

  • 取得 とは、変数を作成し、それを初期化してシステム リソースを参照することを意味します。 Using ステートメントでは、1 つ以上のリソースを取得することも、ブロックを入力して Using ステートメントに指定する前に、1 つのリソースを正確に取得することもできます。 resourceexpressionを指定する場合は、Using ステートメントに制御を渡す前にリソースを取得する必要があります。

  • 使用状況 とは、リソースにアクセスし、それらに対してアクションを実行することを意味します。 UsingEnd Usingの間のステートメントは、リソースの使用状況を表します。

  • 破棄とは、resourcename内のオブジェクトに対してDispose メソッドを呼び出すことです。 これにより、オブジェクトはリソースをクリーンに終了できます。 End Using ステートメントは、Using ブロックの制御下にあるリソースを破棄します。

行動

Using ブロックは、Try...Finally 構築のように動作し、Try ブロックはリソースを使用し、Finally ブロックはそれらを破棄します。 このため、 Using ブロックは、ブロックを終了する方法に関係なく、リソースの破棄を保証します。 これは、 StackOverflowExceptionを除き、ハンドルされない例外の場合でも当てはまります。

Using ステートメントによって取得されるすべてのリソース変数のスコープは、Using ブロックに制限されます。

Using ステートメントで複数のシステム リソースを指定した場合、Usingブロックを入れ子にした場合と同じ効果が得られます。

resourcenameNothingされている場合、Disposeの呼び出しは行われず、例外はスローされません。

Using ブロック内での構造化例外処理

Using ブロック内で発生する可能性のある例外を処理する必要がある場合は、完全なTry...Finally構築を追加できます。 Using ステートメントがリソースの取得に失敗した場合に対処する必要がある場合は、resourcenameNothingされているかどうかをテストできます。

Using ブロックではなく構造化例外処理

リソースの取得を細かく制御する必要がある場合や、 Finally ブロックに追加のコードが必要な場合は、 Using ブロックを Try...Finally 構築として書き換えることができます。 次の例は、resourceの取得と破棄に相当するスケルトン TryUsing構造を示しています。

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

こちらも参照ください