问:有没有办法找出一个对象是否有任何“强引用”?
Raymond Chen 暗示可能有一个解决方案:
您想知道引用计数是零还是非零。为此,请使用弱引用。
笔记
- 我对对象有一个“弱引用”(使用WeakReference)。如果我有一个强引用 ,答案将立即是:“是的。你对这个对象有一个强引用。”
- 垃圾收集器不提供任何答案
- IsAlive 属性只能告诉您是否已收集对象。如果有强烈的引用,则不是。(没有引用的对象可能会被回收 - GC 还没有解决它)
- .NET 中的对象不被引用计数
- 并非所有对象都必须实现IDisposable接口
- 并非所有物品都是我的
代码示例
此代码示例演示了依赖强制垃圾回收和 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");