.NET Developer Empire

帝国の逆襲

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

記事カテゴリ

書庫

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だと、コネクション作るのに時間かかるから、毎回完全にリリースしてしまうと効率が悪そう。個人的に大体こんな結論になりました。

投稿日時 : 2007年8月11日 10:03

コメント

# re: CloseとDisposeの違いって? その2 ~実装を覗いてみよう~ 2007/08/11 10:25 凪瀬
Javaの場合、Connectionはclose()で閉じられるんだけど、
プーリング機能の付いているConnectionの拡張を作る場合は
close()をオーバーライドしてプールに返す仕掛けにするんですよ。

そういう分け方ではなく、最初からプーリング完備ってことなのでしょうか?
プールも含めて全部ご破算にするときはDispose()せよってこと?
あ、でもCloseとDisposeの趣旨からするとそれで辻褄は合うのか。
設計としては一歩進んでいるのかなぁ。

# re: CloseとDisposeの違いって? その2 ~実装を覗いてみよう~ 2007/08/11 11:19 中博俊
.NET Frameworkの実装は逆アセ不可です。
もちろん、このソースはそんなことをしてみたものではないですよね?
SSCLIやmonoのソースですよね?

# re: CloseとDisposeの違いって? その2 ~実装を覗いてみよう~ 2007/08/11 19:30 tatsumihr
なんか誤解があると嫌なので、抽象化しておきました。(^^;

Post Feedback

タイトル
名前
Url:
コメント: