gpt4 book ai didi

c# - 我什么时候应该使用 GC.SuppressFinalize()?

转载 作者:IT王子 更新时间:2023-10-29 03:28:39 26 4
gpt4 key购买 nike

在.NET中,什么情况下应该使用GC.SuppressFinalize()

使用这种方法给我带来了什么好处?

最佳答案

SuppressFinalize 只能由具有终结器的类调用。它通知垃圾收集器 (GC) this 对象已完全清理。

当你有终结器时,推荐的 IDisposable 模式是:

public class MyClass : IDisposable
{
private bool disposed = false;

protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// called via myClass.Dispose().
// OK to use any private object references
}
// Release unmanaged resources.
// Set large fields to null.
disposed = true;
}
}

public void Dispose() // Implement IDisposable
{
Dispose(true);
GC.SuppressFinalize(this);
}

~MyClass() // the finalizer
{
Dispose(false);
}
}

通常,CLR 在创建对象时使用终结器密切关注对象(使创建它们的成本更高)。 SuppressFinalize 告诉 GC 该对象已正确清理,不需要进入终结器队列。它看起来像一个 C++ 析构函数,但并不像一个析构函数。

SuppressFinalize 优化并非微不足道,因为您的对象可以在终结器队列中等待很长时间。请注意,不要试图对其他对象调用 SuppressFinalize。这是一个等待发生的严重缺陷。

设计指南告诉我们,如果您的对象实现了 IDisposable,则终结器不是必需的,但如果您有终结器,则应该实现 IDisposable 以允许确定性清理您的对象类。

大多数时候,您应该能够使用 IDisposable 来清理资源。当您的对象持有非托管资源并且您需要保证这些资源被清理时,您应该只需要一个终结器。

注意:有时编码人员会添加一个终结器来调试他们自己的 IDisposable 类的构建,以测试代码是否已正确处理他们的 IDisposable 对象。

public void Dispose() // Implement IDisposable
{
Dispose(true);
#if DEBUG
GC.SuppressFinalize(this);
#endif
}

#if DEBUG
~MyClass() // the finalizer
{
Dispose(false);
}
#endif

关于c# - 我什么时候应该使用 GC.SuppressFinalize()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/151051/

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