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を確実に閉じる
using System;
using System.IO;

class Sample {
  static void Main()
  {
    StreamReader reader = null;

    try {
      // StreamReaderインスタンスを作成して使用する
      reader = new StreamReader("test.txt");

      Console.WriteLine(reader.ReadToEnd());
    }
    finally {
      // try節を抜けた時点(途中で例外がスローされた場合含む)で
      // StreamReaderがnullでなければDisposeメソッドを呼び出す
      if (reader != null)
        reader.Dispose();
    }
  }
}

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