为什么我们使用Dispose(false)
?
Dispose pattern中的代码?
~MyClass ()
{
Dispose(false);
}
如果我使用Dispose(true)
会怎么样?
如果我跳过此终结器,会发生什么?
答案 0 :(得分:2)
使用Destructurs(〜)覆盖Finalize方法的想法是获得管理代码的能力。在您的示例中,您传递的是false,这意味着配置托管资源。在以下示例中,您可以清楚地看到它。 注意:了解如何通过使用私有成员“dispos”来防止多次调用Dispose方法。
public class Dog : IDisposable
{
// Prevent dispose from happening more than once
private bool disposed = false;
// IDisposable.Dispose
public void Dispose()
{
// Explicitly dispose of resources
DoDispose(true);
// Tell GC not to finalize us--we've already done it manually
GC.SuppressFinalize(this);
}
// Function called via Dispose method or via Finalizer
protected virtual void DoDispose(bool explicitDispose)
{
if (!disposed)
{
// Free some resources only when invoking via Dispose
if (explicitDispose)
FreeManagedResources(); // Define this method
// Free unmanaged resources here--whether via Dispose
// or via finalizer
FreeUnmanagedResources();
disposed = true;
}
}
// Finalizer
~Dog()
{
DoDispose(false);
}
}
答案 1 :(得分:1)
理想情况下,任何时间代码都使用实现IDisposable
的对象完成,它将确保对象的Dispose
方法在被放弃之前被调用。但是,有时候,实施IDisposable
的对象会在没有妥善处置的情况下被放弃。
.NET中的类可以要求系统监视实例,让他们知道它们是否已被放弃。这是通过覆盖名为Finalize
的方法来完成的,该方法是Object
类型的一部分。如果该方法被覆盖且未被抑制,并且系统注意到对象将符合条件,如果不存在活动终结器,则系统将系统移动到Finalize
方法的对象队列应该尽快运行并抑制对象的进一步观察(因此对象将在运行其Finalize
方法时获得一次,但之后将有资格收集)。
出于某种原因,我不明白,C#的创建者决定禁止使用该语言的程序员直接覆盖Finalize
方法。相反,它要求它们使用特殊语法,然后指示编译器覆盖Finalize
。当系统注意到某个对象已被放弃并运行其~ClassName
方法时,将执行标有Finalize
的代码块。