具有静态成员的未引用对象的 .NET GC

本文关键字:对象 NET GC 引用 静态成员 | 更新日期: 2023-09-27 18:19:36

所以我很好奇,在以下情况下,GC - 尤其是最终确定 - 是否会在 .NET 中的实例x上发生:

  • x没有被任何东西引用
  • x具有静态DbConnection属性
  • y是与x相同的类的实例
  • y仍然被某些东西引用

令我震惊的是,在这种情况下,x可以通过外部引用宣布死亡 - 但对其执行最终处理可能会导致DbConnection被处置,而y仍然需要并持有对它的引用。

那么,在我描述的场景中,x收集的是哪个?它最终确定吗?还是在收集其中任何一个实例之前,其类型的所有实例都需要在堆中孤立?每个实例都会完成吗?

我会这么认为,一般规则是否只是:永远不要触摸终结器中的静态或其他共享对象?

具有静态成员的未引用对象的 .NET GC

是的,x实例将有资格使用 GC。 DbConnection ,因为它是静态的,因此与本例中的实例完全无关,并且与确定对象是否符合 GC 条件无关。 只要静态属性包含引用,就不会收集它。

从不触摸终结器中的静态或其他共享对象?

这通常是一个很好的调用。 通常,永远不要为托管类型编写终结器,除非它们包装非托管资源,此时类型除了管理该资源外什么都不做(理想情况下(。 即便如此,在可能的情况下,使用SafeHandle通常是一种更好的方法。