.NET:如何确定对象是否对它有任何引用?
-
28-09-2019 - |
题
Q. 有没有办法找出一个对象是否对它有任何"强引用"?
Raymond Chen暗示, 一个解决方案可能是可能的:
你想知道参考 计数为零或非零。为了那个, 使用WeakReference。
注意事项
- 我有一个"弱引用"到对象(使用 弱参考).如果我有一个 强有力的参考 答案马上就会是:"是的。您对该对象有很强的引用。"
- 垃圾收集器暴露没有答案
- 该 IsAlive财产 只能告诉你,如果一个对象已经 收集到的, ,或者不是。如果有强烈的引用,或者没有。(没有引用的对象可以不被收集-GC只是还没有得到它)
- .NET中的对象不引用计数
- 不是所有的对象都必须包含 可识别的,可识别的 界面
- 并非所有物品都是我的
代码示例
此代码示例演示了依赖于强制垃圾回收和弱引用的问题 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。收集资料)然后在某个地方有一个强有力的参考。
您应该阅读Raymond Chen的帖子关于昨天的参考计数。之后,您应该确定这是否是您真正需要做的事情以及原因。然后回来告诉我们原因。
嗯,看来您已经读了这篇文章-吸收了一些小细节,却错过了重点。
我想知道在数据库连接上调用Dispose是否安全。
一个应用程序可以调用Close多次。没有异常产生。
不隶属于 StackOverflow