1. ホーム
  2. .net

[解決済み] ガベージコレクタはIDisposable.Disposeを呼んでくれるのですか?

2022-05-28 10:05:12

質問

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

しかし、これをそのまま実行するとどうなるでしょうか。

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

で、ファイナライザーも何も実装していません。フレームワークは私のためにDisposeメソッドを呼び出してくれるでしょうか?

はい、私はこれが馬鹿に聞こえることを理解し、すべてのロジックはそうしないことを意味しますが、私はいつも頭の後ろに2つのことを持っていて、それが私を不確かなものにしています。

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

  2. コンパイラー/フレームワークは、実装するインターフェイスに応じて他の「マジック」なことを行うので (例: foreach、拡張メソッド、属性に基づくシリアル化など)、これも「マジック」かもしれないと納得がいきます。

私はそれについて多くのものを読み、多くのことが暗示されてきましたが、私はこれまで 決定的な この質問に対するYesかNoかの答えを見つけることができませんでした。

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

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

Disposeは自動的に呼び出されることはありません。 明示的に リソースが解放される場合、例えば 'using' や 'try finally' ブロックの中で呼び出されなければなりません。

参照 http://msdn.microsoft.com/en-us/library/system.object.finalize.aspx をご覧ください。