问. 有没有办法找出一个对象是否对其有“强引用”?
Raymond Chen 暗示可能有解决方案:
您想知道参考是否 计数为零或非零。为了那个原因, 使用弱引用。
此代码示例演示了依赖强制垃圾回收和 WeakReference 的
IsAlive
属性来确定对象是否有任何未完成的引用的问题。
WeakReference m_wr = null;
...
for (int i = 0; i < 1000000; i++)
{
Pig p = new Pig();
m_wr = new WeakReference(p);
}
...
GC.Collect();
if (m_wr.IsAlive)
Environment.FailFast("All objects should have been collected by now");
不,不使用调试器 API 就不行。
正如你所说,对象没有引用计数......所以找出答案的唯一方法是爬行堆,这通常只是作为垃圾收集的一部分发生。
请注意,即使没有“正常”强引用,该对象也可以作为终结的一部分复活 - 如果终结器队列具有终结器,则它实际上具有对其的引用。无论如何,在这种情况下,您可能不想将对象包含为“无引用”。
首先致电
GC.Collect()
,然后然后检查WeakReference.IsAlive
。如果是 true
(即调用 GC.Collect 后尚未被收集),那么某处存在强引用。