我有几个问题,我无法得到正确的答案。我们为什么要在没有析构函数时调用SuppressFinalize
1)为什么当我们没有析构函数时,我们应该在Dispose函数中调用SuppressFinalize。
2)Dispose和finalize用于在垃圾收集对象之前释放资源。无论是托管资源还是非托管资源,我们需要释放资源,那么为什么我们需要在dispose函数内部存在一个条件,当我们从IDisposable调用这个重写函数时传递'true':Dispose并在从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);
}
}
嗨,乔恩,只是挑剔,但句子“任何持有资源直接可以处理的”,应该可能是“将处理该”,(即“可以” - >“将”),以强调根本不是外部班级的工作。 – 2010-04-09 10:21:13
还有一个问题,因为System.Object是所有对象的基础,默认情况下它已经实现了一个finalize方法,即使我们没有提供析构函数,也不会将GC放到finalize队列中吗?或者为什么我们说如果我们不提供destrutor对象不会被放入最终队列?因为通过继承保护成员就像派生类的私有成员。 – somaraj 2010-04-09 10:58:46
从非平凡的父类派生的子类是否有任何合法的原因,如果父类不具有清理终结器?我想不出任何情况下,派生类将任何非托管资源封装到自己的类中,并将其自己的终结器完全脱离主类。实际上,即使所有人都想要一个“警钟”终结器,最好将* *封装到它自己的类中,而不是为派生类添加终结器。 – supercat 2012-04-12 15:01:37