我有一个像这样的简单类,它实现了IDisposable
,所以它被CA1816 击中:正确调用 GC.SuppressFinalize:
public class A : IDisposable
{
// ...
int foo
public A()
{
SomeObj.SomeEvent += DoSomething;
}
public void Dispose()
{
SomeObj.SomeEvent -= DoSomething;
}
}
更改 A.Dispose() 以调用 GC.SuppressFinalize(object)。这将防止引入终结器的派生类型需要重新实现“IDisposable”来调用它。
现在我已经读过这个、这个和这个,但我仍然不明白那到底是什么(更多解释如下)。所以我的问题是:
如果我不明白它是什么,我是否应该总是添加
GC.SuppressFinalize(object)
到我的方法中?Dispose
我什么时候不应该这样做而只是抑制警告?
添加更多上下文:我仍然不明白在SuppressFinalize
做什么。我知道我已经在(示例中的事件处理程序或资源等)中处置了一些资源,但是仍然需要清理类似的变量呢?那么“这将阻止引入终结器的派生类型需要重新实现”的警告部分又如何呢?Dispose
IDisposable
int foo
终结器或析构函数是 C++ 的遗产,但在 C# 中,它延长了 GC 收集对象所需的时间。
当您使用 dispose 模式时,您手动释放(或通过 using 语句)资源,不再需要终结器。方法
GC.SuppressFinalize
是告诉GC忽略目标的终结器,像普通对象一样收集它,从而提高GC的性能。如果不调用此方法,就会失去使用 dispose 模式的意义,因此最好始终添加它。是的,你的类没有终结器,但你不能保证它的子类也没有。请注意,此分析不会在密封类中报告(根据我的测试,内部/私有类也不会)。
应该永远不会。如上所述,即使不调用
GC.SuppressFinalize
,通常也只会影响性能。除非你在dispose方法和终结器中分别释放资源,但感觉这是某种编程错误。