我正在研究一段库代码IDisposable
。托管路径 (via using
) 易于测试。不过,我想知道终结器:调用System.GC.Collect()
足以强制终结器运行吗?
David Schmitt
问问题
4437 次
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 回答