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()呼びようが無い。
リソース開放が必要なクラスのコンストラクタ全般に言える話でした。