トップ回答者
Disposeについて(返信がうまくできないので新たにスレッドをたてます)

質問
回答
-
Dispose()メソッドは、アンマネージなリソース(ファイルオープンやDBとの接続)を開放するメソッドであること。
と、理解しているのですが。
Dispose メソッドは,
「Disposeメソッドを公開しているそのクラス自身が
クラスメンバとして握っている参照を切る場所」
です。
参照を切るだけです。
それ以上でもそれ以下でもないと考えると楽になるかも。
アンマネジドリソースが解放されるのは,
そういう実装がしてあるクラスの場合は,そうであって,
Disposeメソッドは,アンマネジドリソースを開放することを示しているわけではない です。
# そのクラスがアンマネジドリソースを利用していて,
# 使い終わったら終了処理する必要があるのかないのか?
# また,そのメソッドがどのメソッドなのか?
# は,結局,「ドキュメントを読む/に書いておく」 しかないです。
-
外池と申します。細かいところまで突っ込まれると私も自信がないのですが・・・、私の頭の中での整理をご紹介しておきます。
まず、マネージリソース「だけ」に注目すれば、まめぞう1118さんのご理解で大丈夫だと思います。最初のスレッドにあった、例えば、String型だけのメンバーしかもっていないオブジェクトに対してDisposeを実装しても、あまり意味はありません。たとえ、String型のメンバーにnull参照を代入してやったとしても、もともとString型のデータで占有されていたメモリーはGCが行われるまではそのままになっています。
次に、アンマネージリソースを用いているオブジェクトについて、.Net Frameworkのクラスライブラリーにもともとはいっているクラスを参考に(手本に)してみると良いと思います。、Disposeメソッドを実装しているクラスは、やはり、Disposeの時点でアンマネージリソースを解放(大抵の場合はメモリーの点でご利益がある)するものと言って良いと思います。
で、
自作のクラスが、Disposeメソッドを実装しているクラスのオブジェクトをメンバーとして保持しているとしましょう。この場合、自作のクラスがアプリの中で不要になった時点で・・・、保持しているオブジェクトをDisposeしてしまいたいですよね? ですので、自作のクラスにもDisposeを実装して、アプリから呼んでもらえるようにするわけです。
すべての返信
-
Dispose()メソッドは、アンマネージなリソース(ファイルオープンやDBとの接続)を開放するメソッドであること。
と、理解しているのですが。
Dispose メソッドは,
「Disposeメソッドを公開しているそのクラス自身が
クラスメンバとして握っている参照を切る場所」
です。
参照を切るだけです。
それ以上でもそれ以下でもないと考えると楽になるかも。
アンマネジドリソースが解放されるのは,
そういう実装がしてあるクラスの場合は,そうであって,
Disposeメソッドは,アンマネジドリソースを開放することを示しているわけではない です。
# そのクラスがアンマネジドリソースを利用していて,
# 使い終わったら終了処理する必要があるのかないのか?
# また,そのメソッドがどのメソッドなのか?
# は,結局,「ドキュメントを読む/に書いておく」 しかないです。
-
Hongliang さんからの引用 マネージリソースってのは何を念頭に置かれてますか?
ていうかまあ実際にマネージしてるのはオブジェクトが占有するメモリだけなんですけどね。
自分的に、マネージリソースは、オブジェクトが占有しているメモリで
かつ、CLRが管理しているメモリ。
このマネージリソースが未使用になるとガベージコレクションによって開放される。
で、アンマネージリソースがファイルストリームやDBのコネクション。
と認識してました。
自分の場合は物覚えが悪いので
何度も読まないと、なかなかちゃんと理解できないのです。
なので、うまく回答できていないかもしれませんが。。。
-
外池と申します。細かいところまで突っ込まれると私も自信がないのですが・・・、私の頭の中での整理をご紹介しておきます。
まず、マネージリソース「だけ」に注目すれば、まめぞう1118さんのご理解で大丈夫だと思います。最初のスレッドにあった、例えば、String型だけのメンバーしかもっていないオブジェクトに対してDisposeを実装しても、あまり意味はありません。たとえ、String型のメンバーにnull参照を代入してやったとしても、もともとString型のデータで占有されていたメモリーはGCが行われるまではそのままになっています。
次に、アンマネージリソースを用いているオブジェクトについて、.Net Frameworkのクラスライブラリーにもともとはいっているクラスを参考に(手本に)してみると良いと思います。、Disposeメソッドを実装しているクラスは、やはり、Disposeの時点でアンマネージリソースを解放(大抵の場合はメモリーの点でご利益がある)するものと言って良いと思います。
で、
自作のクラスが、Disposeメソッドを実装しているクラスのオブジェクトをメンバーとして保持しているとしましょう。この場合、自作のクラスがアプリの中で不要になった時点で・・・、保持しているオブジェクトをDisposeしてしまいたいですよね? ですので、自作のクラスにもDisposeを実装して、アプリから呼んでもらえるようにするわけです。