c# - 为什么在终结器中序列化对象不是一个好主意?

标签 c# finalizer

在 Headfirst C# 一书中,我的观点是“在终结器中序列化一个对象不是一个好主意,因为序列化需要整个对象树都在堆中,但你最终可能会丢失程序的重要部分,因为某些对象可能在终结器运行之前就已被收集。”

我的问题是,由于我的对象获得了对其他对象的引用(这意味着至少有一个对其他对象的引用),如何在我的终结器运行之前对它们进行垃圾回收?

最佳答案

因为垃圾收集器没有定义运行终结器的任何顺序,并且不关心你的对象是否乱序终结。

当你的终结器运行时,GC 已经决定它和它引用的每个对象都是不可访问的,因此所有这些子对象也将被收集。这些对象中的每一个都被添加到终结器队列中,但不能保证 GC 会以任何表面上合理的顺序处理它们。

这是您可以在终结器中执行的操作的限制之一:您必须假设所有子对象都可能已经被销毁。 Object.Finalize 的文档明确指出这一点:

The finalizers of two objects are not guaranteed to run in any specific order, even if one object refers to the other. That is, if Object A has a reference to Object B and both have finalizers, Object B might have already been finalized when the finalizer of Object A starts.

关于c# - 为什么在终结器中序列化对象不是一个好主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32285963/

相关文章:

.net - 是否允许终结器调用其他托管类的方法?

java - SWIG 结构成员被 Java 的垃圾收集器过早释放

c# - 在 C# 中查找 map 区域的算法

c# - 如何在 jquery 中获取模型列表 <string>

c# - 从 Print Spooler API 获取打印作业的用户域名

c# - 如何从电子邮件地址 ArrayList 中删除重复的域电子邮件地址

.net - 调用 Dispose 方法会清除和压缩 .Net 中的内存吗?

F# 等价于析构函数

c# - 为什么在 Hashset 或其他集合中使用继承对象时 Equals(object) 胜过 Equals(T)?

java - 如何在Java中实现对象计数器