gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 22:22:22 25 4
gpt4 key购买 nike

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

Raymond Chen暗示a solution might be possible :

You want to know whether the reference count is zero or nonzero. For that, use WeakReference.



笔记
  • 我对该对象有一个“弱引用”(使用 WeakReference )。如果我有一个强引用,答案将立即是:“是的。你对这个对象有一个强引用。”
  • the garbage collector exposes no answers
  • IsAlive property只能告诉你一个对象是否已被收集。如果有强烈的引用,则不是。 (没有引用的对象可能会被回收 - GC 还没有处理它)
  • .NET 中的对象没有被引用计数
  • 并非所有对象都必须实现 IDisposable接口(interface)
  • 并非所有元素都是我的

  • 代码示例

    此代码示例演示了依赖强制垃圾回收和 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");

    最佳答案

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

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

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

    关于.NET:确定对象是否对它有任何引用的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3470271/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com