在dotnet中完成/处理模式

时间:2015-11-01 03:40:14

标签: dispose

为什么我们使用Dispose(false)

Dispose pattern中的代码?

~MyClass ()
{
       Dispose(false);
}

如果我使用Dispose(true)会怎么样? 如果我跳过此终结器,会发生什么?

2 个答案:

答案 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的代码块。