ガベージコレクターはIDisposable.Disposeを呼び出しますか? 質問する

ガベージコレクターはIDisposable.Disposeを呼び出しますか? 質問する

ネットIDisposable パターン 暗示するファイナライザを記述し、IDisposable を実装する場合、ファイナライザは明示的に Dispose を呼び出す必要があります。これは論理的であり、ファイナライザが正当化されるまれな状況で常に実行してきたことです。

しかし、次のようにするとどうなるでしょうか:

class Foo : IDisposable
{
     public void Dispose(){ CloseSomeHandle(); }
}

ファイナライザーなどを実装しません。フレームワークが Dispose メソッドを呼び出してくれるでしょうか?

はい、これは馬鹿げたことのように聞こえるし、すべての論理がそうならないことを示唆していることはわかっていますが、私は常に頭の片隅に 2 つの不安を抱えていて、それが不安の原因でした。

  1. 数年前、実際にそうなるだろうと私に言った人がいました。その人は「自分のことをよく知っている」という非常に確かな実績を持っていました。

  2. コンパイラ/フレームワークは、実装するインターフェースに応じて他の「魔法の」ことを実行します (例: foreach、拡張メソッド、属性に基づくシリアル化など)。そのため、これも「魔法」である可能性があるのは当然です。

私はそれについて多くのことを読み、多くのことが暗示されているが、私は決定的この質問に対する「はい」または「いいえ」の回答。

ベストアンサー1

.Netガベージコレクターは、ガベージコレクション時にオブジェクトのObject.Finalizeメソッドを呼び出します。デフォルトこれは何もない追加のリソースを解放したい場合はオーバーライドする必要があります。

Disposeは自動的に呼び出されないので、明示性'using' または 'try finally' ブロック内などでリソースを解放する必要がある場合に呼び出されます。

見るマイクロソフト詳細については

おすすめ記事