在哪里可以清理配置模式中的非托管资源?

时间:2019-03-18 10:05:09

标签: c# garbage-collection

我对这种模式感到困惑。

如果dispose是true(从Dispose()调用),则在那里释放托管对象。 如果dispose为false(从Finalizer()中调用),则访问引用对象并不安全,这些引用对象是诸如文件流之类的非托管对象。

如果处理正确,那么我们将无法释放非托管对象? 如果处理不正确,我们将无法释放托管对象?

搜索此模式,Dispose(boolean)方法有不同的实现。 MSDN implementation

这是我从示例和教程中得到的。

protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                // Free any other managed objects here.
            }
            else
            {
                //not safe to access referenced object
            }
            // Free any unmanaged objects here.
        }
        disposed = true;
    }

2 个答案:

答案 0 :(得分:1)

无论参数Dispose(boolean disposing)的值如何,必须在方法disposing内完成未管理资源的清除。您可以找到more details here

答案 1 :(得分:1)

在格式正确的IDisposable模式true中,disposing的值表示我们从明确的Dispose调用或通过离开using范围来达到方法。 IDisposable消费的首选方式。但是,并不是所有的使用者都得到了适当的实现,并且为了确保我们能够在终结器中调用IDisposable的{​​{1}}实现中回收所有非托管资源。因此,Dispose(false)中的false表示我们已在完成阶段到达此调用,并且在此阶段某些引用可能不可用,这就是我们使用此标志的原因-区分我们在常规流程执行下可以做什么以及在敲定阶段的条件下我们可以做些什么。无论此标志如何,我们都会取消分配非托管资源。