C# 以及在终结器中不能做什么

C# and what not to do in a finalizer

我读了一些关于在 C# Finalizer 中不能做什么的内容,但我终究找不到 link。

调用析构函数时,在拥有析构函数的 class 中使用引用对象安全吗?

我相信这就是我读到的内容。但如果是这样的话,析构函数就不能调用 Dispose 方法来清理非托管资源,对吗?

注意:我知道 IDisposable 和通用实现。

"rules" 的基本要点是在整理器中,您只能调用具有已知活动根的对象(例如所有静态对象)和没有活动根的对象派生自 CriticalFinalizerObject,除非你是 CriticalFinalizerObject,否则你不能调用其他 CriticalFinalizerObject

您自己的 class 终结器所在的大多数对象可能会禁止触摸,因为它们不在活动根上(毕竟您的 class 正在被终结)并且它们不会'继承自 CriticalFinalizerObject.

有一篇非常好的文章“What Your Mother Never Told You About Resource Deallocation”解释了在终结器期间可以做什么和不能做什么,并解释了通过对所有非托管资源使用 SafeHandle 的模式摆脱了您需要自己编写终结器。这篇文章读起来很长,但请尝试全部阅读并理解它,它真的让我对我在处理托管和非托管对象方面所做的一切正确和错误的事情敞开心扉。

这篇文章介绍了如何使用 SafeHandle,(从 CriticalFinalizerObject 派生的 class 并且是 IDisposable),这样您就不必担心编写自己的终结器.