具有静态成员的未引用对象的 .NET GC
本文关键字:对象 NET GC 引用 静态成员 | 更新日期: 2023-09-27 18:19:36
所以我很好奇,在以下情况下,GC - 尤其是最终确定 - 是否会在 .NET 中的实例x
上发生:
-
x
没有被任何东西引用 -
x
具有静态DbConnection
属性 -
y
是与x
相同的类的实例 -
y
仍然被某些东西引用
令我震惊的是,在这种情况下,x
可以通过外部引用宣布死亡 - 但对其执行最终处理可能会导致DbConnection
被处置,而y
仍然需要并持有对它的引用。
那么,在我描述的场景中,x
收集的是哪个?它最终确定吗?还是在收集其中任何一个实例之前,其类型的所有实例都需要在堆中孤立?每个实例都会完成吗?
我会这么认为,一般规则是否只是:永远不要触摸终结器中的静态或其他共享对象?
是的,x
实例将有资格使用 GC。 DbConnection
,因为它是静态的,因此与本例中的实例完全无关,并且与确定对象是否符合 GC 条件无关。 只要静态属性包含引用,就不会收集它。
从不触摸终结器中的静态或其他共享对象?
这通常是一个很好的调用。 通常,永远不要为托管类型编写终结器,除非它们包装非托管资源,此时类型除了管理该资源外什么都不做(理想情况下(。 即便如此,在可能的情况下,使用SafeHandle
通常是一种更好的方法。