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

时间:2014-08-27 20:20:04

标签: c# .net garbage-collection finalizer

所以我很好奇,在以下情况下,GC(特别是最终确定)会在.NET中的实例x上发生:

  • x未被任何内容引用
  • x具有静态DbConnection属性
  • y是与x
  • 相同的类的实例
  • y仍被
  • 引用

令我感到震惊的是,在这种情况下,x可能被外部引用声明为死亡 - 但对其执行finalization可能会导致DbConnection被处理,而y仍然需要并保持对它的引用。

在我描述的场景中,它是x收集的是哪一个?它最终确定了吗?或者在收集它们中的任何一个之前,它的所有类型的实例都需要在堆中孤立吗?是否会在每个实例中进行终结?

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

1 个答案:

答案 0 :(得分:5)

是的,x实例符合GC的条件。 DbConnection,因为它是静态的,在这种情况下与实例完全无关,与确定对象是否符合GC的条件无关。只要static属性包含引用,它就不会被收集。

  

永远不要触摸终结器中的静态或共享对象?

这通常是一个很好的电话。通常,您不应该为托管类型编写终结器,除非它们包装非托管资源,此时类型除了管理该资源(理想情况下)之外什么都不做。即使这样,在可能的情况下使用SafeHandle通常也是更好的方法。