重新注册Finalize方法 抑制Finalize方法 实际生活示例

6

“SuppressFinalize” 是常见的,但我不知道何时才会使用 “ReRegisterForFinalize”。 - CodesInChaos
3个回答

11

在 .NET 框架中,有一些地方会使用到它,这通常是查找的好地方。基本模式如下:

  • 一个已经被处理过的对象被再次使用。Dispose() 方法调用了 SuppressFinalize,因此需要重新注册(NativeWindow、RequestContextBase、TaskExceptionHolder 类)。
  • 终结器失败并捕获异常。只能稍后重试。该代码被包裹在 if(!Environment.HasShutdownStarted && !AppDomain.CurrentDomain.IsFinalizingForUnload()) 中以确保这样做是有意义的(DynamicResolver 和 LoaderAllocatorScout 类)。
  • 对象参与缓存方案并被重新缓存(OverlappedData 类)。

3

IDisposable 的实现通常需要使用 SuppressFinalize:代码请参见此处此处

我暂时没有关于ReRegisterForFinalize的好例子。


1
好的,“SuppressFinalize”看起来很简单,阅读这些示例后就可以理解。如果我自己处理了对象,它可以防止昂贵的finalize方法被调用。 - Nahum

1

当你复活一个实例时,你需要使用ReRegisterForFinalize。在链接的文章中提到的复活是将对象从其析构函数(finalizer)重新根源化的操作。

这只是把问题转移到了“何时复活对象”的问题上。在我回答this question时,我猜测连接池或类似的结构可能会使用它。


我仍然不知道何时需要使用 ReRegisterForFinalize - Nahum
1
在“普通”的应用程序或库代码中,您不会这样做。 ConnectionPool是一种高度专业化的软件。 - H H

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