C# 在dispose模式中,在何处清理非托管资源?

C# 在dispose模式中,在何处清理非托管资源?,c#,garbage-collection,C#,Garbage Collection,我对这种模式感到困惑 如果disposing为true(从Dispose()调用),我们将在那里释放托管对象。 如果disposing为false(从Finalizer()调用),则访问被引用对象是不安全的,这些被引用对象是像filestream这样的非托管对象 如果disposing为true,那么我们将无法释放非托管对象? 如果disposing为false,我们将无法释放托管对象 搜索此模式时,Dispose(boolean)方法中有不同的实现 这是我从示例和教程中得到的 protecte

我对这种模式感到困惑

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

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

搜索此模式时,Dispose(boolean)方法中有不同的实现

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

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

无论参数
disposing
的值如何,都必须在方法
Dispose(boolean disposing)
内清除未管理的资源。您可以发现

无论参数
disposing
的值如何,都必须在方法
Dispose(布尔disposing)
中清理未管理的资源。您可以在格式正确的
IDisposable
模式
true
中找到,
disposing
的值意味着我们通过显式的
Dispose
调用或通过使用
范围离开
到达方法,这是
IDisposable
消费的首选方式。但是,并非所有使用者都正确实现,为了确保我们能够回收
IDisposable
实现中的所有非托管资源,我们从终结器调用
Dispose(false)
。因此,
Dispose
中的
false
表示我们在终结阶段完成了此调用,并且在此阶段某些引用可能不可用,这就是为什么我们使用此标志-以区分我们在正常流执行下可以做什么以及在终结阶段条件下可以做什么。无论此标志如何,我们都会解除对非托管资源的分配。

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

//在此处释放任何非托管对象。
执行“无论
释放
是否为真”。再次查看控制流。。。。非托管对象,如filestream。
FileStream
是托管对象,底层文件句柄将是非托管对象。
//在此处释放任何非托管对象。
“执行”无论
是否为true。再次查看控制流。。。。非托管对象,如filestream。
FileStream
是托管对象,底层文件句柄将是非托管对象。