10

の周りのライブラリ コードに取り組んでいますIDisposable。管理パス (経由using) は簡単にテストできます。私はファイナライザーについて疑問に思っていますSystem.GC.Collect().ファイナライザーを強制的に実行するのに十分な呼び出しはありますか?

4

4 に答える 4

8

いいえ、GC.Collect() 呼び出しは非同期です。これも呼び出す必要があります。

System.GC.WaitForPendingFinalizers();
于 2008-10-29T10:45:54.730 に答える
2

Dispose、Finalization、および Resource Management を 見てみましょう。これは、私が知っている主題に関する最良のリファレンスです。彼らのパターンを使用して:

~ComplexCleanupBase()
{
    Dispose(false);
}

public void Dispose()
{
    Dispose(true);
    GC.SuppressFinalize(this);
}

protected override void Dispose(bool disposing)
{
   if (!disposed)
   {
        if (disposing)
        {
            // dispose-only, i.e. non-finalizable logic
        }

        // new shared cleanup logic
        disposed = true;
    }

    base.Dispose(disposing);
}

非常に単純な Finalizer/Dispose() メソッドと、テスト可能な Dispose(bool) で終わります。GC クラスを使用してファイナライズなどを強制する必要はありません。

于 2009-02-11T18:45:23.137 に答える
0

私は Finalize() に別のメソッドを呼び出させることに傾倒し、他のメソッドがあなたが望むことを行うことをテストすると思います。100% のコード カバレッジは得られませんが、少なくともメソッドがオブジェクトのリソースを適切に解放することはわかります。

于 2008-10-29T21:31:04.057 に答える
0

インターフェイスをモックアウトして、IDisposableへの呼び出しを期待できますDisposeか? これにより、オブジェクトが実際にいつ破棄されるかを少なくとも確認できます。

于 2008-10-29T10:43:09.090 に答える