もくじ
→https://qiita.com/tera1707/items/4fda73d86eded283ec4f
Dispose関連
やりたいこと
C#を触りだして結構時間が経ったが、Dispose()が何をしているのか(何か、リソースの解放??)、実はよくわかっていなかったので、そろそろ知っておきたい。
Disposeのできた経緯とやっていることの概要
Disposeは、「リソースの解放」を行うものだが、リソースには大まかに2つある。
- メモリは「マネージリソース」といい、プログラマが意識しなくても、GCが自動的に開放してくれる。
- ファイルやDBコネクションは「アンマネージリソース」といい、GCが自動的には開放してくれない。
GCのおかげでメモリの解放をプログラマがしなくてよくなったが、
- ただし、GCがいつ走るかはプログラマにはわからない。
- 通常、アンマネージリソースは、プログラマが
deleteと解放処理を書いたときに、リソースが開放される。(通常、デストラクタにdelete解放処理を書く) - GCが走った時にデストラクタが呼ばれ、その時
delete解放処理を書いていればアンマネージリソースは解放されるが、GCに任せていてはいつデストラクタが呼ばれるかわからない。(ファイルを使用後、すぐ閉じないといけない場合など、それでは困ってしまう) - なので、デストラクタに
delete解放処理を書いても意味がなくなってしまった。(解放のタイミングを制御できない)
そこで、
- 解放のタイミングを制御しないといけないリソースは、「Dispose」で解放することに決めた。
- Disposeを行うクラスは「IDisposable」を
継承実装するが、IDisposableを継承実装しているということは「解放のタイミングを制御必要である」ということを、作る側が、使う側に表明している。 - 使う側は、Disposeを行うことで、解放のタイミング
がシビアを制御必要なリソースの解放を制御することができる。
逆に言うと、自分でIDisposableを実装してDisposeを書く時には、
- Disposeに、アンマネージリソースの解放処理を入れないといけない。
- Disposeのほかに、アンマネージリソースの解放を行うメソッド等ある場合、二重に解放してしまわないよう注意しないといけない。
参考
Dispose の意味が未だわからないのですが
https://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=34497&forum=7&start=8
>こちらの、「囚人」さんの記事を参考にさせていただいています。(ほぼ流用。言い換えただけ)
ありがとうございます。
[雑記] Dispose にまつわる余談
https://ufcpp.net/study/csharp/rm_disposable.html?sec=idisposable#idisposable
>今回の内容とずれるが、StreamクラスのClose()とdispose()は同じことをしている。無駄な重複なので、MSもCloseを持たせたことを失敗と思っている。らしい。