在一次性模式下呢?

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

}


对不起,很抱歉。我的意思是说,如果没有非托管资源,我需要终结器吗?上面的一次性图案不够好吗?是的,即使用户/开发人员不调用处置,GC也不默认调用处置吗?

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

请参见
standard dispose pattern? why do we need "disposing" parameter in the virtual method and isn't the finalizer get called after dipose always?
 更多细节。

在其他情况下,当我们有终结器时,为什么要使用false作为参数调用Dispose。



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

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

仍然没有获得总要旨,但仍在阅读文章。

但是,如果没有多余的资源,则以下模式应该有效...

根据msdn.microsoft.com/zh-CN/magazine/cc163392.aspx#S2,msdn.microsoft.com/en-us/library/fs2xkftw.aspx建议在finalizer中释放本机资源,并使用dispose( )。如果显式调用dispose(),则可以抑制finalizer。即如果没有本地资源,我们就不需要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);
    }
}


问候,
梦想家

最佳答案

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

不过,这种情况非常少见-通常,您实际上只能通过其他托管类型间接引用非托管资源,而托管类型则需要终结器。

关于c# - 如果我的类实现IDisposable,为什么需要终结器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10854801/

10-13 08:08