我有几个问题,但是找不到合适的答案。
1)当我们没有析构函数时,为什么需要在Dispose函数中调用SuppressFinalize。
2)Dispose和finalize用于在对象被垃圾回收之前释放资源。无论是托管资源还是非托管资源,我们都需要释放它,那么为什么我们需要在dispose函数中使用条件语句,说在从IDisposable:Dispose调用此重写函数时传递'true',在从finalize中调用时传递false。
请查看我从网络上复制的以下代码。
class Test : IDisposable
{
private bool isDisposed = false;
~Test()
{
Dispose(false);
}
protected void Dispose(bool disposing)
{
if (disposing)
{
// Code to dispose the managed resources of the class
}
// Code to dispose the un-managed resources of the class
isDisposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
如果我删除布尔值保护的Dispose函数并实现如下,会怎样呢?
class Test : IDisposable
{
private bool isDisposed = false;
~Test()
{
Dispose();
}
public void Dispose()
{
// Code to dispose the managed resources of the class
// Code to dispose the un-managed resources of the class
isDisposed = true;
// Call this since we have a destructor . what if , if we don't have one
GC.SuppressFinalize(this);
}
}
WeakReference
是否已失效(如果可终结对象不持有主对象的强引用,则终结器或其他任何东西都不应阻止主对象停止存在)。如果WeakReference
尚未失效,则终结器应将其调用视为虚警并重新注册自己以进行终结。这样做可以防止恶意外部代码使用复活来欺骗对象的终结器在对象正在使用时运行。 - supercat