LoginSignup
11

More than 3 years have passed since last update.

【C#】Disposeとは?

Last updated at Posted at 2019-04-15

もくじ
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
  3. You can use dark theme
What you can do with signing up
11