Effective C# 3rd 読書メモ 46 リソースの後始末にusingとtry/finallyを利用する

.NET Frameworkの管理下にない(アンマネージド)リソースを使用する型は、Dispose()メソッドによって明示的に解放すべきである。Dispose()メソッドをもつ型を使うときに、Dispose()を実行するのは あなたの 責任である。Dispose()が必ず呼ばれるようにする最良の方法は、using文を使うか、try/finallyブロックを使うかである。

public void ExecuteCommand(string connectionString,
    string command)
{
    using (var connection = new SqlConnection(connectionString))
    using (var sqlCommand = new SqlCommand(command, connection))
    {
        connection.Open();
        sqlCommand.ExecuteNonQuery();
    }
}

同様の処理をtry/finallyで書くと以下のようになる。

public void ExecuteCommand(string connectionString,
    string command)
{
    SqlConnection myConnection = null;
    SqlCommand myCommand = null;

    try
    {
        myConnection = new SqlConnection(connectionString);
        myCommand = new SqlCommand(command, myConnection);

        myConnection.Open();
        myCommand.ExecuteNonQuery();
    }
    finally
    {
        myConnection?.Dispose();
        myCommand?.Dispose();
    }
}

usingはコンパイル時の型がIDisposableを実装している場合にのみ利用可能で、任意の型に対して利用できるわけではない。

以下のように、usingをキャストと共に使うと、(1) objがIDisposableを実装している場合は、using文が実行される (2) objがIDisposableを実装していない場合は、using文は実行されない という結果になる。

object obj = Factory.CreateResource();
using (obj as IDisposable)
    WriteLine(obj.ToString());

コメントを残す

コメントを残す