代码之家  ›  专栏  ›  技术社区  ›  Dan Tao

对委托的引用是否构成对对象的引用(以防止垃圾收集)?

  •  8
  • Dan Tao  · 技术社区  · 15 年前

    我想不出一个表达这个问题的好方法,所以让我试着举例说明:

    假设我有一些接口。为了简单起见,我会说接口是 IRunnable 它提供了一个单一的方法, Run . (这不是真的,只是一个例子。)

    现在,假设我有一些已经存在的类,我们称之为 Cheetah 我无法改变。它以前就存在过 不可救药的 我不能 制作 它实现了我的接口。但我想用它 犹如 它实现 不可救药的 --大概是因为它有一个 方法,或类似的方法。换句话说,我希望能够使用期望 不可救药的 并将与 猎豹 .

    好吧,所以我可以一直写 CheetahWrapper 一类交易。但请你给我点幽默,让我写些更灵活的东西——那 RunnableAdapter ?

    我把类定义想象成这样:

    public class RunnableAdapter : IRunnable {
        public delegate void RunMethod();
    
        private RunMethod Runner { get; set; }
    
        public RunnableAdapter(RunMethod runner) {
            this.Runner = runner;
        }
    
        public void Run() {
            Runner.Invoke();
        }
    }
    

    够直接的,对吧?所以有了这个,我就可以打这样的电话了:

    Cheetah c = new Cheetah();
    RunnableAdapter ra = new RunnableAdapter(c.Run);
    

    现在,我有一个实现 IRunner 在它的内心深处,是 猎豹 .

    我的问题是:如果这个 猎豹 我的在某个时候超出了范围,到了通常会被垃圾收集的地步…会吗?还是这个? 伦纳布雷德 对象的 Runner 财产构成对原件的引用。 猎豹 这样就不会被收集?我当然希望引用保持有效,所以基本上我想知道上面的类定义是否足够,或者是否需要维护对底层对象的引用(比如通过一些私有的 UnderlyingObject 属性),只是为了防止垃圾收集。

    4 回复  |  直到 15 年前
        1
  •  9
  •   itowlson    15 年前

    是的,该引用仍然有效,实际上可以使用delegate.target属性在代码中作为 ra.Runner.Target .

        2
  •  4
  •   Esben Skov Pedersen    15 年前

    正如其他人所说,它算作参考。你可能会觉得这个故事很有趣。 http://asserttrue.blogspot.com/2008/11/garbage-collection-causes-car-crash.html

        3
  •  2
  •   Grumdrig    15 年前

    如果不是,那听起来像是一个坏的垃圾收集器。

        4
  •  2
  •   Justin Grant    15 年前

    是的,代表算作参考。在也无法访问委托之前,不会对对象进行垃圾收集。