C#のusingステートメントの機能

IDisposabeleインターフェースを継承したクラスは、以下のように。usingを使用して以下のように記述すると

using(var hoge = new Hoge())
{
}

以下のように展開されたのとほぼ同じような形で処理が行われ、リソースが即座に解放されます。

Hoge hoge = null;
try
{
    hoge = new Hoge();
}
finaly
{
    if(hoge != null)
    {
        hoge.Dispose();
    }
}

nullを指定しても大丈夫

なので、nullチェックしてくれるのでnullを渡しても大丈夫です。

public static void Main(string[] args)
{
    try
    {
        StreamWriter sw = null;

        using (sw)
        {
            Console.WriteLine("sw is null.");
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
}

出力結果は

sw is null.

で、例外などは発生しません。

複数段並べられる

意外と知らない人もいるようで、以下のように中かっこをはじめない限りステートメントを重ねることができます。

using(var a = this.a)
using(var b = this.b)
using(var c = this.c)
{
   // any
}

// c → b → a の順番に解放される

MemoryStream → FileStreamなど宣言を重ねる時はこちらを使用したほうがネストが少なくなります。

usingの丸かっこで複数インスタスを宣言できる

以下のように1種類のインスタンスに限り2個目以降は、型を指定せずに連続して宣言できます。

using (StreamWriter sw1 = new StreamWriter(@"d:\aaa.txt"),
                    sw2 = new StreamWriter(@"d:\bbb.txt"),
                    sw3 = new StreamWriter(@"d:\ccc.txt"))
{
    // any
}

// sw3 → sw2 → sw1 の順に解放される

意外と知られてない(というか知らないで全く問題ない)のですが最後の方法は知っていたらかなりマニアだなと思います。