【发布时间】:2017-10-11 14:50:03
【问题描述】:
我知道垃圾收集器使用 Finalize 方法让对象释放非托管资源。据我所知,Object.Finalize 永远不会被 GC 直接调用(如果它的类型 overrides 通过实现终结器来实现 Finalize 方法,则在它的构造过程中将对象添加到 f-reachable 队列中)。
Object.Finalize 仅从自动生成的终结器代码调用:
try
{
//My class finalize implementation
}
finally
{
base.Finalize(); // Here chain of base calls will eventually reach Object.Finalize/
}
因此,拥有一个派生自 Object 的任意类不会调用 Object.Finalize - 您需要 Object.Finalize 的终结器才有意义,而对于大多数类来说,它没有意义并且未被使用(并不是说它的实现是实际上是空的)。
如果不覆盖 Object.Finalize 以及在不尝试{}finally{base.Finalize()} 通话?类似于 Add 方法的集合初始化方法 - 您不必实现任何接口或重写该方法 - 只需实现 public void Add(item) 方法即可。
这会使 C# 编译器稍微复杂一点,但通过删除一个冗余调用使终结器运行得稍微快一些,最重要的是 - 使 Object 类更易于理解,而无需使用具有空实现的受保护 Finalize 方法,而它不需要完成任何事情。
还可以实现从 Object 派生的 FinalizableObject 类,并使编译器派生所有具有终结器的类。它可以实现 IDisposable 并使disposing pattern, recommended by Microsoft 可重用,而无需在每个类中实现它。其实我很惊讶这样的基类不存在。
【问题讨论】:
-
是什么让你认为你“需要在每个类中实现 [IDisposable]”?这绝对是不是正确的。
-
@JoelCoehoorn 我并没有说我们在每个班级都需要 IDisposable。我们当然不会。所以我的问题是为什么我们在每个类中都有 Finalize(继承自 Object)?
标签: c# .net garbage-collection finalizer