我对这种模式感到困惑。
如果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;
}
答案 0 :(得分:1)
无论参数Dispose(boolean disposing)
的值如何,必须在方法disposing
内完成未管理资源的清除。您可以找到more details here
答案 1 :(得分:1)
在格式正确的IDisposable
模式true
中,disposing
的值表示我们从明确的Dispose
调用或通过离开using
范围来达到方法。 IDisposable
消费的首选方式。但是,并不是所有的使用者都得到了适当的实现,并且为了确保我们能够在终结器中调用IDisposable
的{{1}}实现中回收所有非托管资源。因此,Dispose(false)
中的false
表示我们已在完成阶段到达此调用,并且在此阶段某些引用可能不可用,这就是我们使用此标志的原因-区分我们在常规流程执行下可以做什么以及在敲定阶段的条件下我们可以做些什么。无论此标志如何,我们都会取消分配非托管资源。