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

时间:2010-08-12 17:15:13

标签: .net garbage-collection clr object-lifetime

问。有没有办法找出一个对象是否有任何“强引用”?


Raymond Chen暗示a solution might be possible

  

您想知道是否参考   count为零或非零。为了那个原因,   使用WeakReference。

备注

  • 我对该对象有一个“弱引用”(使用WeakReference)。如果我有一个强烈的参考,答案立即就是:“是的。你对该对象有强烈的引用。”
  • the garbage collector exposes no answers
  • IsAlive property只能告诉您对象是否已收集。如果有强烈的引用,或者不是。 (没有引用的对象可以不被收集 - 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");

3 个答案:

答案 0 :(得分:9)

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

正如你所说,对象不是引用计数...所以找出的唯一方法是抓取堆,这通常只是垃圾收集的一部分。

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

答案 1 :(得分:3)

首先致电GC.Collect()然后检查WeakReference.IsAlive。如果它是true(即,在调用 GC.Collect 之后尚未收集它),则会在某处提供强引用。

答案 2 :(得分:2)

你应该从昨天开始阅读Raymond Chen关于参考计数的post。在那之后 - 你应该决定你是否真的需要这样做以及为什么。然后回来告诉我们原因。

嗯,似乎你已经阅读了后期吸收的细节,但没有注意到这一点。


  

我想知道在数据库连接上调用Dispose是否安全。

阅读文档。 Dispose调用Close。 Close可以随心所欲地打电话。

  

应用程序可以多次调用Close。没有例外。