.NET Developer Empire

帝国の逆襲

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  15  : 記事  5  : コメント  48  : トラックバック  8

記事カテゴリ

書庫

2007年8月11日 #

CloseとDisposeの違いって? でCloseは再オープン可能、Disposeは再オープン不可能という話になりました。

じゃあ、.NET Frameworkの実装ではどうなってるの?という疑問に当然たどり着くわけです。「プログラムは仕様通りに動くのではなく、実装通りに動く!」という名言もあります。調べてみたのはStreamとConnection。本当かどうかは分からないので、あまり信じすぎないでね。

ストリーム

public void Dispose() 
{
  // Close()を呼び出す
}
public virtual void Close()
{
  // 実際にストリームを閉じる処理をする
}

ストリームでは、DisposeメソッドはCloseメソッドを内部で呼び出しているようです。この場合、一度Closeしてしまったら再Openはできません。

では、Connectionはどうでしょうか?要約すると、多分こんな感じ。嘘だったらごめんなさい。

コネクション

public void Dispose() 
{
  // コネクションを閉じる
}
public virtual void Close()
{
  // 現在持っているDbConnectionをクラス内部のコネクションプールにキャッシュしている感じ?
}

DisposeするとDbConnectionにGCがかかりそうな予感。Closeの場合は、クラスの内部的にキャッシュして持っているだけなイメージ。つまり再オープン可能。

こういう風に実装が違うのって、扱う対象の性質に合わせているのかな?FileStreamだと閉じた後にしっかりリリースしてくれないと、他のところから書き込みとか行った場合に不整合が生じてしまいそう。DbConnectionだと、コネクション作るのに時間かかるから、毎回完全にリリースしてしまうと効率が悪そう。個人的に大体こんな結論になりました。

posted @ 10:03 | Feedback (3)