首页 > 解决方案 > 在哪里清理处置模式中的非托管资源?

问题描述

我对这种模式感到困惑。

如果 disposing 为真(从 Dispose() 调用),我们将在那里释放托管对象。如果 disposing 为 false(从 Finalizer() 调用),则访问引用的对象是不安全的,这些引用的对象是像文件流这样的非托管对象。

如果 disposing 为真,那么我们将无法释放非托管对象?如果 disposing 是 false,我们将无法释放托管对象?

搜索这个模式,在 Dispose(boolean) 方法中有不同的实现。MSDN 实现

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

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;
    }

标签: c#garbage-collection

解决方案


在正确形成的IDisposable模式中,truedisposing意味着我们从显式Dispose调用或离开using范围(这是更可取的IDisposable消费方式)到达方法。然而,并非所有消费者都被正确实现,为了确保我们能够在我们从终结器IDisposable调用的实现中回收所有非托管资源。Dispose(false)因此false,在Dispose指示我们在终结阶段到达此调用并且在此阶段某些引用可能不可用,这就是我们使用此标志的原因 - 以区分我们在正常流程执行下可以做什么和在终结阶段条件下我们可以做什么。无论此标志如何,我们都会释放非托管资源。


推荐阅读