WebRequestクラスなど「dispose」「close」を最後に書くものについて

タグの編集
投稿者 R-1  (社会人) 投稿日時 2011/4/2 23:03:20
ああいったものは「dispose」「close」を書かないとどうなるんですか?
投稿者 るきお  (社会人) 投稿日時 2011/4/2 23:17:53
いろいろな嫌なことが起こります。

Disposeについて一般的に言えるのはメモリを余計に使うことです。
Disposeしておけば、メモリを使わないで済むものを、Disposeしないと比較的長い間メモリを使い続けることになります。

他にDisposeとCloseの両方に多く言えることは、そのクラスが中でつかっている「もの」(リソース)が使い続けられます。
そのクラスが中で何を使っているかによって具体的に起こることは変わります。
たとえば、ファイルに書き込んだあとCloseしないと、ファイルは開きっぱなしになります。画面には表示されないので気にならないかもしれませんが、ファイルを開きっぱなしにすると、ほかのプログラムがそのファイルの読み書きができなくなったり、そのファイルの削除や名前変更ができなくなる場合があります。
ネットワークに接続するクラスであれば、使い終わっても裏ではネットワークにつながったままになるかもしれません。
データベースなどは、ほかの人にデータを変更されないように一時的にデータをロックすることがありますが、Closeしないといつまでたってもロックが解除されず、だれも読み書きできなくなるなどということもあるかもしれません。

まとめると、DisposeもCloseも終了処理をする仕組みですので、これを呼び出さないということは終了処理をしないということになります。
終了処理の具体的な内容はクラスによって異なるので、何が起こるかはさまざまです。
投稿者 YuO  (社会人) 投稿日時 2011/4/3 02:17:23
書かなかった場合,Disposeパターンに則っているならば,GCされるまでアンマネージリソースが解放されません。
Closeは単にDisposeの別名であることが推奨されているので,Closeしなかった場合でも基本的には同じです。
MSDN: アンマネージ リソースをクリーンアップするための Finalize および Dispose の実装
http://msdn.microsoft.com/ja-jp/library/b1yfkh5e(VS.90).aspx

ただ,[2005]以降でDisposeを明示することが必要な場合というのはあまり多くなく,
Using文が使えるならばUsing文に任せた方がよいです。
# Try-Finally-End Tryを毎回書くより楽ですし。
MSDN: Using ステートメント (Visual Basic)
http://msdn.microsoft.com/ja-jp/library/htd05whh.aspx