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

问题描述 投票:0回答:3

问. 有没有办法找出一个对象是否对其有“强引用”?


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");
.net garbage-collection clr lifetime
3个回答
11
投票

不,不使用调试器 API 就不行。

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

请注意,即使没有“正常”强引用,该对象也可以作为终结的一部分复活 - 如果终结器队列具有终结器,则它实际上具有对其的引用。无论如何,在这种情况下,您可能不想将对象包含为“无引用”。


4
投票

您应该阅读 Raymond Chen 昨天关于引用计数的帖子。之后 - 您应该决定这是否是您真正需要做的事情以及原因。然后回来告诉我们原因。

嗯,看来你已经阅读了这篇文章 - 吸收了一些小细节,但没有抓住重点。


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

阅读文档。 Dispose 调用 Close。 关闭可以安全地拨打任意电话。

一个应用程序可以多次调用 Close。没有产生异常。


3
投票

首先致电

GC.Collect()
,然后然后检查
WeakReference.IsAlive
。如果是
true
(即调用 GC.Collect 后尚未被收集),那么某处存在强引用。

© www.soinside.com 2019 - 2024. All rights reserved.