2011-08-09 16 views
3

&hellipについての説明が必要です。CLRはどのようにIDisposableを実装するクラスを見つけるのですか?

  1. …具体的にどのようにCLR —、ガベージコレクタ—は、IDisposableインターフェイスを実装するクラスを見つけます。および

  2. …メモリを解放するために(IDisposableインターフェイスを実装するすべてのクラスの)Disposeメソッドを呼び出す方法

+3

IDisposableについてもっとお読みください。http://stackoverflow.com/questions/12368/how-to-dispose-a-class-in-net - IDisposableはメモリを解放することとは何の関係もありませんGCはそれをまったく実行しません。 http://stackoverflow.com/questions/732864/finalize-vs-dispose –

+0

@Lasse V. Karlsen:リンクありがとうございました – Syed

答えて

4

CLRは廃棄する()を呼び出していない、これは直接またはusingの文を使用して呼び出すためのユーザコードに任されています。ただし、CLRはfinalizersと呼びますが、これは保証されていません。

+2

CLR **がファイナライザを呼び出している可能性があります。本当に保証はありません。 –

+0

@ダニエル・フェア・ポイント、私は明確にしました。 –

+0

ファイナライザがアプリケーションの終了前に呼び出されることは保証されていませんか? – koumides

1

Disposeは自動的に呼び出されません。コンパイラは、usingと記述するか、直接Disposeを呼び出すと、Disposeへの呼び出しを生成します。

+0

この場合、IDisposableメソッドを実装する必要がある代わりに、リソースを解放するメソッドを作成できます。 try ... finally()で展開している 'using'でも、Disposeメソッドを呼び出します。 IDisposableインターフェイスを実装せずに同じことを行うこともできます。これに対する答えは、私が推測するインターフェースの必要性を説明します。 – Syed

+0

@Syed私はそのコメントを理解していません。 –

+0

私が理解している答えからは、Disposeメソッドを明示的に呼び出す必要があります。私の疑念は、なぜ私たちはIDisposableインターフェイスを実装し、次にDisposeメソッドを実装する必要がある、私たちは直接リソースを解放している他のメソッドを書くことができますです。 – Syed