興味の尽きない内容だけに後々の考察を踏まえメモ…
黒龍さんの発言から
- Close()とDispose()は別物でありDispose()は破棄。Close()は終了を指す。
大抵のクラスでは設計次第ではあるが、再度Open()が可能である。
※ 特にIDisposable.Dispose() を明示的に実装していない場合、public メソッドである Dispose() にどんな役割を担わせるかはクラス設計者の自由である。
- Disposableなクラスは内部的にアンマネージリソースを持っており、この場合Usingなどでの解放が原則として望ましい。
※ 原則としたのは、補足的な情報として、基底クラスの都合で実際には、必要も無いのに IDisposable インターフェースを継承している場合もある為。しかし扱いは変えない。
- メモリ(マネージリソース)の即時解放は参照型では存在しない。用途に合わせ値型にて設計するのも考慮の余地がある。
- 用途によっては弱い参照も要検討
※ 一時的なバッファ等であればより解放されやすいため望ましい。
- 本当に確保&解放が必要か検討
使用後に即時解放したいほどの量を確保することをせず、省リソースなアルゴリズムにする事を心掛けるのも時と場合によって検討した方が良い。
渋木宏明(ひどり) さんの発言内容から
このメモリ(リソースの解放)に伴う考え方で混乱が生じる原因としては、
等をすべて同じ観点で考えようとすることに起因する。
したがって、「場面」や「状況」「背景」といった物事をきちんと押さえておくと、より理解も深まり、対応が可能となる。
データベースコネクションやファイルハンドルなどは、アンマネジリソース群に含まれるため、明示的に解放しなければならないが、クラス実装によって隠蔽されているべきである。
アンマネージリソースを解放するために Close() を呼び出すという考え方は間違いであり、Open() したものは使用後に Close() するのが、使い方や考え方として自然である。
独自に作成したクラスのインスタンスはマネジリソース群に入る。したがって、マネジリソース(メモリ)の解放は、ガベージコレクタの設計と設定次第である。
このマネージリソースの明示的な解放はGC.Collect() で可能であるが、それ以上は不可能である。
ハロルドさんの発言内容から
そもそも、何のためにGCがあるのか・・・
それは、限られたPCのパフォーマンスをより効率よく使用するためである。
使用後、即座にメモリを破棄(解放)するという事は、クラスなどを作成する側から言えば、直感的で理解し易い。しかしながら、使う側がより快適に使える事のほうが重要な場合が存在する。
メモリの開放は、何も今すぐしなくてはいけないような処理では決してないはずであり、そのような処理は、GCの判断に任せる前提で設計してよい。
中 博俊さん επιστημηさん とっちゃん(さん) れんげさん の発言内容から(参考までに)
ガベージコレクション方式/参照カウント方式/プログラムのアロケート/Free方式は古からある管理方式のであり、1980年代のN-BASIC/N88-BASICも昔からガベージコレクション方式であった。
その頃のコンピュータに搭載されているメモリも少なく、ガベージコレクションを効率よく行わないと、頻繁にフリーズしてしまうため、この世代のプログラマの中には、リソースの解放を使用直後に行わないと気持ちが悪いという人もいる。
※ この内容は現在編集途中です。内容について予告なく変更する場合があります。