RunningCSharp

MS系開発者による、雑多な記事。記事は所属企業とは関係のない、個人の見解です。

【C#】using+IDisposableのように一応使える、try-finally

例えば、下記のようなファイルを読み込む処理の場合。

    using (var fs = new FileStream("example.txt", FileMode.Open))
    using (var rs = new StreamReader(fs))
    {
        string line;
        while ((line = rs.ReadLine()) != null)
        {
            Console.WriteLine(line);
        }
    }

usingブロックを抜けた際、IDisposableインターフェースのメソッドDisposeが実行され、オブジェクトの破棄が実施されます。

usingブロックを使わずに(またはIDisposableを継承していないクラスに)、上記挙動を実現するのにtry-finallyが使用できます。

    FileStream fs = null;
    StreamReader rs = null;
    try
    {
        fs = new FileStream("example.txt", FileMode.Open);
        rs = new StreamReader(fs);

        string line;
        while ((line = rs.ReadLine()) != null)
        {
            Console.WriteLine(line);
        }
    }
    finally
    {
        //nullチェックをせずに実行すると、fsかrsがnullの場合、tryでスローした例外がNullReferenceExceptionに上書きされてしまう
        fs?.Dispose();
        rs?.Dispose();
    }

しかしまあ冗長ですし、nullチェックもいりますし… using-IDisopsableはC#の初めのころから(少なくとも2.0から)あり歴史も古いので、基本的にはusingが使われていると思われます。