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