usingステートメントは、IDisposableインターフェイスとtry-finallyステートメントによるオブジェクト破棄の処理を、専用の構文で行えるようにしたものです。 usingステートメントを使うと、IDisposable.Disposeメソッドの呼び出しと、try-finallyステートメントによる例外発生時の考慮を、より簡単な構文で記述することができます。

IDisposableインターフェイスを実装するオブジェクトを扱う場合は、必要なくなった時点でDisposeメソッドを呼び出すようにすることが求められます。 また、例外が発生した場合でも最終的にDisposeメソッドでオブジェクトが破棄されるようにする必要があります。 usingステートメントを使うと、この2つの要求を単一の構文で満たすことができます。 オブジェクトを使用する範囲(オブジェクトの生存期間)がメソッド内で完結するような場合は、usingステートメントが特に便利です。

usingステートメントでは、処理中の例外発生の有無に関わらずスコープから抜ける時点で必ずDisposeメソッドが自動的に呼び出されます。 usingステートメント内では明示的にDisposeメソッドの呼び出しを記述する必要はありませんが、条件分岐などオブジェクトが不要になった時点で明示的に呼び出すこともできます。

usingステートメントを使った例として、StreamReaderを使用する場合は次のようになります。 比較としてtry-finallyステートメントで等価なコードを記述した場合も併記します。

try-finallyステートメントを使ってStreamReaderを確実に閉じる
Imports System
Imports System.IO

Class Sample
  Shared Sub Main()
    Dim reader As StreamReader = Nothing

    Try
      ' StreamReaderインスタンスを作成して使用する
      reader = new StreamReader("test.txt")

      Console.WriteLine(reader.ReadToEnd())
    Finally
      ' Try節を抜けた時点(途中で例外がスローされた場合含む)で
      ' StreamReaderがNothingでなければDisposeメソッドを呼び出す
      If Not reader Is Nothing Then reader.Dispose()
    End Try
  End Sub
End Class

usingステートメントを使うと、try-finallyステートメントとIDisposable.Disposeメソッドの呼び出しを簡略に記述できるだけでなく、オブジェクトのスコープ(有効範囲)と生存期間を明確にできるという利点もあります。