所以我很好奇,在以下情况下,GC(特别是最终确定)会在.NET中的实例x
上发生:
x
未被任何内容引用x
具有静态DbConnection
属性y
是与x
y
仍被令我感到震惊的是,在这种情况下,x
可能被外部引用声明为死亡 - 但对其执行finalization可能会导致DbConnection
被处理,而y
仍然需要并保持对它的引用。
在我描述的场景中,它是x
收集的是哪一个?它最终确定了吗?或者在收集它们中的任何一个之前,它的所有类型的实例都需要在堆中孤立吗?是否会在每个实例中进行终结?
我会这么认为,遵循的一般规则是:永远不要触摸终结器中的静态或共享对象?
答案 0 :(得分:5)
是的,x
实例符合GC的条件。 DbConnection
,因为它是静态的,在这种情况下与实例完全无关,与确定对象是否符合GC的条件无关。只要static属性包含引用,它就不会被收集。
永远不要触摸终结器中的静态或共享对象?
这通常是一个很好的电话。通常,您不应该为托管类型编写终结器,除非它们包装非托管资源,此时类型除了管理该资源(理想情况下)之外什么都不做。即使这样,在可能的情况下使用SafeHandle
通常也是更好的方法。