如果我的类实现了IDisposable,为什么还需要终结器?

Dre*_*mer 3 .net c# c#-3.0

下面的一次性模式怎么样?

using System;
public class MyClass : IDisposable 
{     
    public void Dispose() 
        // Implement IDisposable     
    {
        //just do the cleanup
        GC.SuppressFinalize(this);
    } 

} 
Run Code Online (Sandbox Code Playgroud)

抱歉是因为气馁.我想说,如果没有未管理的资源,我需要终结器吗?上述一次性图案不够好吗?是的,即使用户/开发者没有调用dispose,默认情况下GC不会调用处理吗?

那么GC调用处理和终结器的顺序又如何呢?

请看 标准配置模式?为什么我们需要在虚拟方法中使用"disposing"参数,而不是在dipose之后调用终结器? 更多细节.

在其他我们有终结器时,为什么我们调用Dispose with false作为参数.


http://msdn.microsoft.com/en-us/magazine/cc163392.aspx#S2看起来总是建议从终结器而不是托管引用中释放未损坏的资源.

它始终建议从Dispose方法中释放未损坏的资源......

尽管如此,仍然没有得到全面的要点并阅读文章.

但如果没有没有损坏的资源,下面的模式应该工作......

根据msdn.microsoft.com/en-us/magazine/cc163392.aspx#S2,msdn.microsoft.com/en-us/library/fs2xkftw.aspx,建议在终结器中释放本机资源,并使用dispose释放所有资源( ).如果dispose()被明确地调用,它可以抑制finalizer.ie; 如果没有原生的reosurces,我们不需要fianlizer.

using System;
public class MyClass : IDisposable 
{ 
    private bool disposed = false;  
    protected virtual void Dispose(bool suppressFinalize) 
    {    
        if (!disposed)
        {
            //Just do the cleanup
            //and release resources
            disposed = true; 
        }
        if (!suppressFinalize)
        {
            GC.SuppressFinalize(this); 
        }
    }
    public void Dispose() 
        // Implement IDisposable     
    {
        Dispose(true);           
    } 
    ~MyClass() // the finalizer
    {     
        Dispose(false);    
    }
} 
Run Code Online (Sandbox Code Playgroud)

问候,梦想家

Jon*_*eet 11

因为您可能直接引用了非托管资源(例如Windows句柄),并且即使没有人调用也要释放它们Dispose.

这是非常罕见的 - 通常你只是通过其他托管类型实际上间接引用非托管资源,如果需要它们将具有终结器.