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

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 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
投稿者 るきお  (社会人) 投稿日時 2011/4/2 23:17:53
いろいろな嫌なことが起こります。

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

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

まとめると、DisposeもCloseも終了処理をする仕組みですので、これを呼び出さないということは終了処理をしないということになります。
終了処理の具体的な内容はクラスによって異なるので、何が起こるかはさまざまです。
投稿者 R-1  (社会人) 投稿日時 2011/4/2 23:03:20
ああいったものは「dispose」「close」を書かないとどうなるんですか?