1. ホーム
  2. c#

[解決済み] C#でIDisposableとdestructorの違いは何ですか?

2022-09-22 17:58:07

質問

クラスに対して、デストラクタではなく IDispose を実装するのはどのような場合ですか? 私は この記事 を読みましたが、私はまだポイントを逃しています。

私の仮定では、オブジェクトに IDispose を実装すると、ガベージコレクタがそれを行うのを待つのではなく、明示的にそれを「破壊」することができます。 これは正しいでしょうか。

つまり、私は常にオブジェクト上で明示的にディスポースを呼び出すべきだということでしょうか? これの一般的な例にはどのようなものがありますか?

どのように解決するのですか?

ファイナライザ(別名デストラクタ)はガベージコレクション(GC)の一部です。GCは主にメモリの圧迫(つまり、より多くのスペースが必要)の結果として起こるので、いつ(あるいはいつ)起こるかは不定です。ファイナライザは、通常は アンマネージド 管理されたリソースは独自の収集/廃棄を行うからです。

したがって IDisposable 決定論的に オブジェクトをクリーンアップするために使用されます。これはオブジェクトのメモリを回収しませんが (それはまだ GC に属します)、たとえばファイルやデータベース接続などを閉じるために使用されます。

これに関する以前のトピックはたくさんあります。

最後に、このように IDisposable オブジェクトはファイナライザも持っていることが珍しくないことに注意してください。この場合は Dispose() は通常 GC.SuppressFinalize(this) つまり、GC はファイナライザを実行せず、単にメモリを捨てるだけです(ずっと安上がりです)。ファイナライザは、もし Dispose() を忘れてもファイナライザは実行されます。