.NET:确定对象是否有任何引用的方法?

Ian*_*oyd 9 .net clr garbage-collection object-lifetime

:有没有办法找出一个对象是否有任何"强引用"?


Raymond Chen暗示可能有一种解决方案:

您想知道引用计数是零还是非零.为此,请使用WeakReference.

笔记

  • 我有一个对象的" 弱引用 "(使用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");
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 9

不,不是没有使用调试器API.

正如你所说,对象不是引用计数...所以找出的唯一方法是爬行堆,这通常只是作为垃圾收集的一部分发生.

请注意,即使在没有"正常"强引用之后,对象也可以作为最终化的一部分复活 - 如果终结器队列有终结器,则终结器队列有效地引用它.也许你不希望在这种情况下将对象包含为"无参考".