代码之家  ›  专栏  ›  技术社区  ›  Ian Boyd

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

  •  9
  • Ian Boyd  · 技术社区  · 15 年前

    问。


    陈雷蒙暗示 a solution might be possible :

    使用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 回复  |  直到 15 年前
        1
  •  11
  •   Jon Skeet    15 年前

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

    就像你说的,对象不被计算在内。。。所以找到答案的唯一方法就是对堆进行爬网,这通常只是垃圾收集的一部分。

    请注意,即使在没有“正常”强引用之后,该对象也可以作为终结的一部分重新启动—如果终结器队列有终结器,那么它实际上有一个对它的引用。在这种情况下,也许您不想将对象包含为“无引用”。

        2
  •  3
  •   Mark Cidade    15 年前

    第一个电话 GC.Collect() 然后 WeakReference.IsAlive true (即打电话后还未领取) GC.Collect )那么在某个地方有一个强有力的参考。

        3
  •  3
  •   Amy B    15 年前

    post 关于昨天的参考资料。在那之后-你应该决定这是否是你真正需要做的事情以及为什么。那就回来告诉我们为什么。


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

    阅读文档。 Dispose 通话结束。 Close 你想打多少电话都行。

    应用程序可以多次调用Close。未生成异常。

    推荐文章