当没有终结器时,为什么要使用GC.SuppressFinalize()?

3

正如问题所述,我只是想知道,因为我被问到了,但我一点头绪也没有,这是否有任何原因?

2个回答

7

当一个类没有定义终结器(析构函数)时,对该类的实例调用SuppressFinalize()方法没有任何效果

通常情况下,这是完整可释放实现的残留部分。只需将其删除或忽略即可。


3
如果一个类没有finalizer,GC.SuppressFinalize()等同于GC.KeepAlive()。因此,它不仅会禁用该类自身的finalizer运行,还会确保任何它所引用的对象的finalizer在处理完成之前不会被调度执行。它不能防止对象在没有处理的情况下被放弃时finalizer提前运行,但可以防止在对象被正确处理的情况下其所拥有的对象过早地进行finalization。 - undefined
@supercat - 这里你的顶级评论可能需要引用一些来源。我简直不明白。 - undefined
@HenkHolterman:一个对象只有在没有任何正在运行的代码能够获取或持有对它的引用时才能被销毁。如果运行的代码具有或可能获取对X的引用,而X包含对Y的引用,系统将假设运行的代码可能会获取对Y的引用。只要存在一条可能的执行路径,在该路径上会调用GC.SuppressFinalize(X)方法,代码就需要保持对X的引用,以便将其传递给该方法(这意味着对象X必须继续存在直到此时)。 - undefined
嗯,这对于任何引用来说都是正确的。SuppressFinalize在任何方面都不特殊。而且由于它通常是从Dispose()中调用的,我看不出它有什么相关性。 - undefined
1
@HenkHolterman:假设Foo在整个宇宙中是唯一一个对对象Bar持有强引用的地方,而Bar又具有一个finalizer,并且Bar的finalizer会对对象Boz产生一些对Foo操作不利的副作用。如果最后一次使用对Foo的引用是调用一个作用于Boz的方法,那么在没有GC.KeepAliveGC.SuppressFinalize的情况下,系统可能会在函数仍在使用Boz时开始运行Bar的finalizer。添加任何一个GC.*调用都可以确保这种情况不会发生。 - undefined
显示剩余2条评论

3

这样做的原因可能是为了防止潜在的错误,如果有人稍后添加终结器并忘记添加GC.SuppressFinalize()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接