标准处置模式?为什么我们在虚拟方法中需要“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);
    } 
} 

标准处置模式?为什么我们在虚拟方法中需要“disposing”参数,并且总是在 dispose 之后不调用终结器

此外,我们在终结器中调用带有 false 的 dispose,它不会释放或进行清理。

实际上 - 在这种情况下,它将假定其他类处理自己的清理,并且只清理直接的非托管资源。

那么,如果处置永远不会被调用怎么办?

然后调用终结器,它将清理任何直接的非托管资源,但不担心间接资源。

处置不是总是在终结器之前被调用吗?

如果没有人出于任何原因打电话,那就不行了。

我认为这种模式比它需要的更复杂,因为它试图解释充当可能需要终结器的其他类的基类的类。密封你的类,你可以完全实现你期望:)

您可能还想阅读Joe Duffy的"Never write a finalizer"博客文章以及对模式的冗长解释。