search
LoginSignup
9

More than 3 years have passed since last update.

posted at

updated at

【C#】Disposeとは?

もくじ
https://qiita.com/tera1707/items/4fda73d86eded283ec4f

Dispose関連
- 【C#】Disposeとは?
- [C#] デストラクタと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を持たせたことを失敗と思っている。らしい。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
9