あなたのプログラムがそうでなければ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++(別のスレッドの良い主題となる複雑さの別の層)である他の誰かのコードのリークを追跡しようとしているからです。
GCはDispose
を呼び出さず、ファイナライザーを呼び出します(これはDispose(false)
を呼び出す必要があります)。
側面の関連記事を参照するか、DisposeパターンのC#ベストプラクティスを参照してください( docs on IDisposable
十分にIIRCを説明します)。
短い答えは「いいえ」です。 "。NET Garbage Collectorに依存するのは悪い習慣ですか?" および "Dispose()を呼び出さないとどうなりますか?"