web-dev-qa-db-ja.com

ガベージコレクターはDispose()を呼び出しますか?

あなたのプログラムがそうでなければGCは最終的にDisposeを呼び出すと思いましたが、クリーンアップを決定的にするためにあなたのプログラムでDispose()を呼び出すべきだと思いました。

しかし、私の小さなテストプログラムからは、Disposeが呼び出されることはまったくありません。

public class Test : IDisposable
{
    static void Main(string[] args)
    {
        Test s = new Test();
        s = null;
        GC.Collect();
        Console.ReadLine();
    }

    public Test()
    {
        Console.WriteLine("Constructor");
    }

    public void Dispose()
    {
        Console.WriteLine("Dispose");
    }
}

//出力は単なる「コンストラクター」であり、期待どおりの「破棄」は得られません。調子はどう?

編集:はい、Dispose()を呼び出す必要があることは知っています-使い捨てオブジェクトを使用するときは標準パターンに従います。私の質問は、管理されているC++(別のスレッドの良い主題となる複雑さの別の層)である他の誰かのコードのリークを追跡しようとしているからです。

58
noctonura

GCはDisposeを呼び出さず、ファイナライザーを呼び出します(これはDispose(false)を呼び出す必要があります)。

側面の関連記事を参照するか、DisposeパターンのC#ベストプラクティスを参照してください( docs on IDisposable 十分にIIRCを説明します)。

54
Eloff
2
Dave Black