首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IDisposable GC.SuppressFinalize(此)位置

IDisposable GC.SuppressFinalize(此)位置
EN

Stack Overflow用户
提问于 2009-03-03 07:49:40
回答 5查看 3.9K关注 0票数 11

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

代码片段:

代码语言:javascript
复制
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)“?在释放托管资源之后,我会将"GC.SuppressFinalize(this)“放在protected方法的"if (isDisposing)”部分。

如下所示:

代码语言:javascript
复制
protected virtual void Dispose(bool isDisposing)
{
    if (!this.disposed)
    {
       if (isDisposing)
       {
           //cleanup managed resources

           GC.SuppressFinalize(this);
       }

       //cleanup unmanaged resources

       this.disposed = true;
    }
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-03-03 08:55:31

我想这是模板设计模式的一个明显的例子。

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

这里有两种情况:

Dispose中的代码段1,SuppressFinalize

Dispose中的代码段2,SuppressFinalize (True)

在这里,代码片段1确保始终执行GC.SuppressFinalize。而代码段2则将GC.SuppressFinalize的执行交由派生类处理。

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

这是在Dispose而不是Dispose中编写SuppressFinalize的唯一好处(True)。

票数 12
EN

Stack Overflow用户

发布于 2009-03-03 10:56:05

Dispose(bool isDisposing)方法不属于IDisposable接口。

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

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

如果您的类中没有终结器,那么您根本不需要调用SuppressFinalize,因为没有终结器需要抑制!

Joe Duffy有一些很棒的guidelines on disposal, finalization, garbage collection etc

票数 6
EN

Stack Overflow用户

发布于 2009-03-03 08:04:10

我认为任何一种布局都可以选择,但可能他们想要在受保护的Dispose方法中强调“将所有释放代码放在这个方法中”,所以他们将另一个Dispose(抑制finalization)工件放在了其他地方。

另外,假设一个派生类有另一个调用受保护的Dispose方法的原因,但仍然希望终结化发生(不管是什么原因,我不知道)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/605466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档