我有一个关于如何使用Dispose()
和析构函数的问题。阅读了一些文章和MSDN文档,这似乎是实现Dispose()
和析构函数的推荐方式。
但是,我有两个关于这种实现方式的问题,可以在下面阅读到:
class Testing : IDisposable
{
bool _disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!_disposed) // only dispose once!
{
if (disposing)
{
// Not in destructor, OK to reference other objects
}
// perform cleanup for this object
}
_disposed = true;
}
public void Dispose()
{
Dispose(true);
// tell the GC not to finalize
GC.SuppressFinalize(this);
}
~Testing()
{
Dispose(false);
}
}
在Dispose()中调用GC.SuppressFinalize(this)
当程序员使用 using
或显式调用 Dispose() 时,我们的类会调用 GC.SuppressFinalize(this)
。我的问题是:
- 这到底意味着什么? 对象会被收集但不会调用析构函数吗?我猜答案是肯定的,因为析构函数会被框架转换为 Finalize() 调用,但我不确定。
没有调用Dispose()时的Finalize()
假设 GC 将清理我们的对象,但程序员没有调用 Dispose()
。
- 为什么此时我们不能释放资源?换句话说,为什么我们不能在析构函数中释放资源?
if 中必须执行什么代码?什么代码应该在 if 外面执行?
if (!_disposed) // only dispose once!
{
if (disposing)
{
//What should I do here and why?
}
// And what here and why?
}
提前感谢。
SafeHandle
,而托管资源通常不需要终结器。 - CodesInChaos