正如问题所述,我只是想知道,因为我被问到了,但我一点头绪也没有,这是否有任何原因?
当一个类没有定义终结器(析构函数)时,对该类的实例调用SuppressFinalize()方法没有任何效果。
SuppressFinalize()
通常情况下,这是完整可释放实现的残留部分。只需将其删除或忽略即可。
GC.SuppressFinalize()
GC.KeepAlive()
GC.SuppressFinalize(X)
Foo
Bar
Boz
GC.KeepAlive
GC.SuppressFinalize
GC.*
这样做的原因可能是为了防止潜在的错误,如果有人稍后添加终结器并忘记添加GC.SuppressFinalize()。
GC.SuppressFinalize()
等同于GC.KeepAlive()
。因此,它不仅会禁用该类自身的finalizer运行,还会确保任何它所引用的对象的finalizer在处理完成之前不会被调度执行。它不能防止对象在没有处理的情况下被放弃时finalizer提前运行,但可以防止在对象被正确处理的情况下其所拥有的对象过早地进行finalization。 - undefinedGC.SuppressFinalize(X)
方法,代码就需要保持对X的引用,以便将其传递给该方法(这意味着对象X必须继续存在直到此时)。 - undefinedFoo
在整个宇宙中是唯一一个对对象Bar
持有强引用的地方,而Bar
又具有一个finalizer,并且Bar
的finalizer会对对象Boz
产生一些对Foo
操作不利的副作用。如果最后一次使用对Foo
的引用是调用一个作用于Boz
的方法,那么在没有GC.KeepAlive
或GC.SuppressFinalize
的情况下,系统可能会在函数仍在使用Boz
时开始运行Bar
的finalizer。添加任何一个GC.*
调用都可以确保这种情况不会发生。 - undefined