4

IDisposableインターフェースを実装する目的は何ですか?いくつかのクラスがそれを実装しているのを見ましたが、その理由がわかりません。

4

5 に答える 5

9

クラスがアンマネージリソースを作成する場合は、IDisposableを実装して、オブジェクトが破棄されたときにこれらのリソースが適切にクリーンアップされるようにすることができます。Disposeをオーバーライドして、そこで解放します。

于 2009-01-18T02:27:20.640 に答える
5

クラスが何らかのシステム リソースを使用する場合、そのリソースも確実に解放するのはクラスの責任です。.Net 設計では、クラスの Dispose メソッドでそれを行うことになっています。IDisposable インターフェイスは、クラスが使用されなくなったときにリソースを解放する必要があることをマークし、クラスのユーザーがそれを呼び出して消費されたリソースを解放できるように、Dispose メソッドを使用できるようにします。

自動クリーンアップを適切に機能させ、using() ステートメントを使用する場合は、IDisposable メソッドも不可欠です。

于 2009-01-18T02:31:49.600 に答える
3

管理されていないリソースを解放するだけでなく、オブジェクトはスコープ外に出た瞬間に便利な操作を実行できます。便利な例はタイマー オブジェクトです。このようなオブジェクトは、Dispose() メソッドで構築されてから経過した時間を出力できます。次に、これらのオブジェクトを使用して、一連の操作にかかったおおよその時間を記録できます。

using(Timer tmr=new Timer("blah"))
{
    // do whatever
}

もちろん、これは手動で行うこともできますが、適切なコードを自動的に生成するコンパイラの機能を可能な限り利用する必要があると思います。

于 2009-01-18T04:16:01.450 に答える
2

それはすべて、ガベージ コレクション メカニズムに関係しています。.NET Rocks! のエピソード 10 では、Chris Sells がガベージ コレクション、ファイナライザー、および Dispose パターン (および IDisposable インターフェイス) の理由について説明しています。(約34分で開始)。

于 2009-01-18T02:36:15.690 に答える
1

多くのオブジェクトは、クリーンアップしないと問題を引き起こす方法で他のエンティティを操作します。これらの他のエンティティは、ほとんど何でもあり、ほとんどどこにでもある可能性があります。例として、Socket オブジェクトは別のマシンに TCP 接続を開くように要求する場合があります。その他のマシンは、一度に非常に多くの接続を処理できない可能性があります。実際、一度に 1 つの接続しか処理できない Web を備えたアプライアンスである可能性があります。プログラムがソケットを開き、単にそれを忘れた場合、ソケットが閉じられない限り、または閉じられるまで、他のコンピューターはアプライアンスに接続できません (おそらく、アプライアンスは数分間非アクティブの後にソケット自体を閉じるかもしれませんが、それまでは役に立たない)。

オブジェクトが IDisposable を実装している場合、それは必要なクリーンアップ アクションを実行するために必要な知識と原動力を持っていることを意味し、そのようなアクションは、そのような知識と原動力が失われる前に実行する必要があります。IDisposable.Dispose を呼び出すと、そのようなクリーンアップ アクションがすべて実行され、オブジェクトを安全に破棄できます。

Microsoft では、Finalize というメソッドを登録することにより、オブジェクトが放棄からの保護を要求できるようにしています。オブジェクトがそうする場合、オブジェクトが放棄されたことをシステムが検出すると、Finalize メソッドが呼び出されます。Finalize メソッドを実行する機会が与えられるまで、オブジェクトも、それが直接的または間接的な参照を保持しているオブジェクトもメモリから消去されません。これは、オブジェクトが最初に Disposed されずに放棄された場合の「バックストップ」のようなものを提供します。ただし、Finalize を実装するオブジェクトには、呼び出されるタイミングが保証されていないため、多くのトラップがあります。Finalize が呼び出される前にオブジェクトが放棄される可能性があるだけでなく、注意を怠ると、オブジェクトの一部がまだ使用されているときに、システムが実際にオブジェクトに対して Finalize を呼び出す可能性があります。危険なもの。これ'

于 2011-04-16T19:52:29.893 に答える