当前位置:  开发笔记 > 编程语言 > 正文

IDisposable GC.SuppressFinalize(this)位置

如何解决《IDisposableGC.SuppressFinalize(this)位置》经验,为你挑选了2个好方法。

我为我的代码使用默认的IDisposable实现模板(模式).

片段:

public void Dispose()
{
    Dispose(true);

    GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool isDisposing)
{
    if (!this.disposed)
    {
        if (isDisposing)
        {
            //cleanup managed resources
        }

        //cleanup unmanaged resources

        this.disposed = true;
    }
}

我的问题:为什么在Dispose公共方法中调用"GC.SuppressFinalize(this)"?在处理受管资源后,我会在受保护方法的"if(isDisposing)"部分中放置"GC.SuppressFinalize(this)".

像这样:

protected virtual void Dispose(bool isDisposing)
{
    if (!this.disposed)
    {
       if (isDisposing)
       {
           //cleanup managed resources

           GC.SuppressFinalize(this);
       }

       //cleanup unmanaged resources

       this.disposed = true;
    }
}

NileshChauha.. 12

我想它是模板设计模式的一个明显案例.

您的抽象类旨在处理所需的所有重要/必要任务(此处为GC.SuppressFinalize(this)),并允许派生类仅覆盖代码的某些部分.

这里有2个案例:
Snippet 1,SuppressFinalize,Dispose
Snippet 2,SuppressFinalize,Dispose(true)

在这里,Snippet 1确保始终执行GC.SuppressFinalize.在代码片段2中,由于派生类的支配而离开执行GC.SuppressFinalize .

因此,通过在Dispose方法中放置GC.SuppressFinalize,您作为类的设计者将始终确保无论派生类编写的代码是什么,都将执行GC.SuppressFinalize.

这只是在Dispose中编写SuppressFinalize而不是Dispose(true)的好处.



1> NileshChauha..:

我想它是模板设计模式的一个明显案例.

您的抽象类旨在处理所需的所有重要/必要任务(此处为GC.SuppressFinalize(this)),并允许派生类仅覆盖代码的某些部分.

这里有2个案例:
Snippet 1,SuppressFinalize,Dispose
Snippet 2,SuppressFinalize,Dispose(true)

在这里,Snippet 1确保始终执行GC.SuppressFinalize.在代码片段2中,由于派生类的支配而离开执行GC.SuppressFinalize .

因此,通过在Dispose方法中放置GC.SuppressFinalize,您作为类的设计者将始终确保无论派生类编写的代码是什么,都将执行GC.SuppressFinalize.

这只是在Dispose中编写SuppressFinalize而不是Dispose(true)的好处.



2> LukeH..:

Dispose(bool isDisposing)方法不是IDisposable界面的一部分.

您通常会Dispose(true)从您的Dispose方法调用,并Dispose(false)从终结器调用,作为对象尚未处理的情况下的后备.

调用SuppressFinalize告诉GC,不需要调用对象的终结器,大概是因为所有清理都在Dispose调用时完成.

如果你的班级没有终结者,那么你根本不需要打电话SuppressFinalize,因为没有终结者可以压制!

Joe Duffy 在处理,定型,垃圾收集等方面有一些很好的指导.

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有