113

デストラクタではなくクラスに IDispose を実装するのはいつですか? この記事を読みましたが、まだ要点がわかりません。

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

オブジェクトに対して常に明示的に Dispose を呼び出す必要があるということですか? これのいくつかの一般的な例は何ですか?

4

7 に答える 7

143

ファイナライザ (別名デストラクタ) はガベージ コレクション (GC) の一部です。GC は主にメモリ プレッシャー (つまり、より多くのスペースが必要) の結果として発生するため、これがいつ発生するか (あるいは発生するかどうか) は不定です。管理されたリソースには独自の収集/破棄があるため、ファイナライザーは通常、管理されていないリソースのクリーンアップにのみ使用されます。

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

これについては、以前のトピックがたくさんあります。

IDisposable最後に、オブジェクトがファイナライザーを持つことも珍しくありません。この場合、Dispose()通常は を呼び出しますGC.SuppressFinalize(this)。つまり、GC はファイナライザーを実行しません。つまり、単にメモリを破棄します (はるかに安価です)。オブジェクトを忘れた場合でも、ファイナライザーは実行されDispose()ます。

于 2008-12-03T23:09:46.173 に答える
27

このメソッドの役割は、ガベージ コレクション時にFinalize().NET オブジェクトがアンマネージ リソースを確実にクリーンアップできるようにすることです。ただし、データベース接続やファイル ハンドラーなどのオブジェクトは、ガベージ コレクションに頼るのではなく、できるだけ早く解放する必要があります。そのためには、インターフェイスを実装し、メソッドでリソースを解放する必要があります。IDisposableDispose()

于 2008-12-03T23:10:59.667 に答える
9

MSDNには非常に優れた説明があります。

このインターフェイスの主な用途は、管理されていないリソースを解放することです。ガベージ コレクターは、管理対象オブジェクトが使用されなくなると、そのオブジェクトに割り当てられたメモリを自動的に解放します。ただし、ガベージ コレクションがいつ発生するかを予測することはできません。さらに、ガベージ コレクターは 、ウィンドウ ハンドルや開いているファイルやストリームなどのアンマネージ リソースを認識しません。

このインターフェイスの Dispose メソッドを使用し て、ガベージ コレクターと共にアンマネージ リソースを明示的に解放します。オブジェクトの 消費者は、オブジェクトが不要になったときにこのメソッドを呼び出すことができます。

于 2008-12-03T23:14:19.067 に答える
9

C# デストラクタに含める必要があるのは、次の行だけです。

Dispose(False);

それでおしまい。そのメソッドには他に何もありません。

于 2008-12-04T00:48:06.413 に答える
3

とても簡単です。回答済みですが、もう一度やり直しますが、できるだけシンプルにしようと思います。

通常、デストラクタは使用しないでください。.netが実行したいだけです。ガベージコレクトインサイクルの後にのみ実行されます。アプリケーションのライフサイクル中に実際に実行されることはありません。このため、「実行する必要がある」デストラクタにコードを入れないでください。また、実行時にクラス内の既存のオブジェクトが存在することを信頼することはできません(デストラクタが実行される順序が保証されていないため、オブジェクトはすでにクリーンアップされている可能性があります)。

IDisposibleは、クリーンアップが必要なリソース(つまり、ファイルおよびグラフィックスハンドル)を作成するオブジェクトがある場合は常に使用する必要があります。実際、上記の理由により、デストラクタに入れるものはすべてIDisposableに入れる必要があると多くの人が主張しています。

ほとんどのクラスは、ファイナライザーが実行されるときにdisposeを呼び出しますが、これは単に安全策として存在するものであり、決して信頼されるべきではありません。IDisposableを実装するものはすべて、使い終わったら明示的に破棄する必要があります。IDisposableを実装する場合は、ファイナライザーでdisposeを呼び出す必要があります。例については、 http://msdn.microsoft.com/en-us/library/system.idisposable.aspxを参照してください。

于 2008-12-03T23:19:49.273 に答える
0

これは、IDisposable、GC、および破棄を取り巻く霧の一部を解消する別の優れた記事です。

Chris Lyons WebLog Demystifying Dispose

于 2009-09-09T14:57:53.850 に答える