我正在编写一个与IDisposable
相关的库代码部分。通过using
的托管路径易于测试。但是我在想最终器:调用System.GC.Collect()
是否足以强制运行终结器?
我正在编写一个与IDisposable
相关的库代码部分。通过using
的托管路径易于测试。但是我在想最终器:调用System.GC.Collect()
是否足以强制运行终结器?
System.GC.WaitForPendingFinalizers();
GC.Collect()
然后是 GC.WaitForPendingFinalizers();
,但在任何时候 disposing
都不会是 false
。 - Matthew我建议你参考《Dispose,Finalization和资源管理》,这是我所知道的有关此主题的最佳参考。使用他们的模式:
~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);
}
IDisposable
接口并期望调用 Dispose
吗?这至少可以让你看到对象何时被处理。我认为我会倾向于使Finalize()调用另一个方法,并测试该方法是否符合您的要求。您不会获得100%的代码覆盖率,但至少您会知道该方法是否正确释放了对象的资源。