10

我正在研究一段库代码IDisposable。托管路径 (via 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

你能模拟出一个IDisposable接口并期待调用Dispose吗?这至少可以让您看到对象何时被实际处理。

于 2008-10-29T10:43:09.090 回答
0

我想我会倾向于让 Finalize() 调用另一种方法,并测试另一种方法是否符合您的要求。您不会获得 100% 的代码覆盖率,但至少您会知道该方法正确地释放了对象的资源。

于 2008-10-29T21:31:04.057 回答