gpt4 book ai didi

c# - IDisposable GC.SuppressFinalize(this) 位置

转载 作者:可可西里 更新时间:2023-11-01 08:39:11 25 4
gpt4 key购买 nike

我为我的代码使用默认的 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 公共(public)方法中调用“GC.SuppressFinalize(this)”?在处理托管资源后,我会将“GC.SuppressFinalize(this)”放在 protected 方法的“if (isDisposing)”部分。

像这样:

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

GC.SuppressFinalize(this);
}

//cleanup unmanaged resources

this.disposed = true;
}
}

最佳答案

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

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

这里有2个案例:
片段 1,SuppressFinalize,在 Dispose
片段 2,SuppressFinalize,在 Dispose(true) 中

此处,代码段 1 确保始终执行 GC.SuppressFinalize。而片段 2 则让 GC.SuppressFinalize 的执行受制于派生类

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

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

关于c# - IDisposable GC.SuppressFinalize(this) 位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/605466/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com