标准配置模式? 为什么我们需要在虚拟方法中使用“disposing”参数而不是在dipose之后调用终结器?

为什么我们需要在下面的代码片段中进行参数处理

此外,我们在终结器中使用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 again a finalizer again”博客文章以及该模式的详细解释 。