标准处置模式?为什么我们在虚拟方法中需要“disposing”参数,并且总是在 dispose 之后不调用终结器
本文关键字:参数 dispose 调用 之后 disposing 为什么 模式 我们 虚拟 方法 标准 | 更新日期: 2023-09-27 18:35:59
为什么我们需要在下面的代码片段中进行参数处理。
此外,我们在终结器中调用 false 的 dispose,它不会释放或进行清理。
那么,如果处置永远不会被调用怎么办?
处置不是总是在终结器之前被调用吗?
using System;
public class MyClass : IDisposable
{
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
**//Do we really need this condition?
if (disposing)**
{
// called via myClass.Dispose().
// OK to use any private object references
}
disposed = true;
}
}
public void Dispose()
// Implement IDisposable
{
Dispose(true);
GC.SuppressFinalize(this);
}
~MyClass() // the finalizer
{
//why do we need to call with false?
Dispose(false);
}
}
换句话说,为什么不呢?
using System;
public class MyClass : IDisposable
{
private bool disposed = false;
protected virtual void Dispose(bool suppressFinalize)
{
if (!disposed)
{
//Do we really need this condition?
// called via myClass.Dispose().
// OK to use any private object references
disposed = true;
}
if (!suppressFinalize)
{
GC.SuppressFinalize(this);
}
}
public void Dispose()
// Implement IDisposable
{
Dispose(true);
}
~MyClass() // the finalizer
{
//why do we need to call with false?
Dispose(false);
}
}
事实上,我真的需要终结器吗?为什么不这样做?
using System;
public class MyClass : IDisposable
{
public void Dispose()
// Implement IDisposable
{
//just do the cleanup and release resources
GC.SuppressFinalize(this);
}
}
此外,我们在终结器中调用带有 false 的 dispose,它不会释放或进行清理。
实际上 - 在这种情况下,它将假定其他类处理自己的清理,并且只清理直接的非托管资源。
那么,如果处置永远不会被调用怎么办?
然后将调用终结器,它将清理任何直接的非托管资源,但不担心间接资源。
处置不是总是在终结器之前被调用吗?
如果没有人出于任何原因打电话,那就不行了。
我认为这种模式比它需要的更复杂,因为它试图解释充当可能需要终结器的其他类的基类的类。密封你的类,你可以完全实现你期望:)
您可能还想阅读Joe Duffy的"Never write a finalizer"博客文章以及对模式的冗长解释。