IDisposableインターフェースを実装したクラスを作るときに気を付けること。

IDisposableインターフェースを実装したクラスは、usingステートメントを使って確実な終了処理が出来ないといけない。

usingステートメントは以下のように書き

using (var db = new SqlConnection(connectionString))
{
    db.Open();
}

usingステートメントを使わない以下のコードと同等になる

var db = new SqlConnection(connectionString);
try
{
    db.Open();
}
finally
{
    if (db != null)
    {
        ((IDisposable)db).Dispose();
    }
}

ポイントは、tryの前にオブジェクトの生成が行われている点。
つまり、コンストラクタで例外が発生した場合Dispose()が実行されないということ。

■結論
というわけで、コンストラクタで例外が発生した場合はDispose()が不要な様に作る必要がある。


■追記
よく考えるとusingステートメントとか関係ないか。
コンストラクタで例外が発生したら戻り値が無いからDispose()呼びようが無い。
リソース開放が必要なクラスのコンストラクタ全般に言える話でした。