Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对委托的引用是否构成对对象的引用(以防止垃圾收集)?_C#_.net_Delegates_Garbage Collection - Fatal编程技术网

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

C# 对委托的引用是否构成对对象的引用(以防止垃圾收集)?,c#,.net,delegates,garbage-collection,C#,.net,Delegates,Garbage Collection,我很难想出一个好的方法来表达这个问题,所以让我试着用例子来解释: 假设我有一些接口。为了简单起见,我要说接口是IRunnable,它提供了一个方法Run。(这不是真的;这只是一个例子。) 现在,假设我有一个预先存在的类,让我们称之为Cheetah,我无法更改它。它在IRunnable之前就存在了;我不能让它实现我的接口。但是我想使用它,就好像它实现了IRunnable——大概是因为它有一个Run方法,或者类似的东西。换言之,我希望能够拥有需要IRunnable的代码,并且能够与Cheetah一起

我很难想出一个好的方法来表达这个问题,所以让我试着用例子来解释:

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

现在,假设我有一个预先存在的类,让我们称之为
Cheetah
,我无法更改它。它在IRunnable之前就存在了;我不能让它实现我的接口。但是我想使用它,就好像它实现了
IRunnable
——大概是因为它有一个
Run
方法,或者类似的东西。换言之,我希望能够拥有需要
IRunnable
的代码,并且能够与
Cheetah
一起工作

好的,所以我总是可以写一个
CheetahWrapper
类的交易。但是请幽默我,让我写一些更灵活的东西——一个
Runnableapter
怎么样

我设想类定义如下:

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);
够简单了吧?有了这个,我应该可以打这样的电话:

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
的对象,在它的内心深处是一只
猎豹


我的问题是:如果我的这只猎豹在某一点上超出了范围,并且达到了通常会被垃圾收集的程度。。。会吗?或者此
RunnableAdapter
对象的
Runner
属性是否构成对原始
Cheetah
的引用,因此不会收集它?我当然希望该引用保持有效,因此基本上我想知道上面的类定义是否足够,或者是否有必要维护对底层对象的引用(例如通过一些私有
underyingobject
属性),以防止垃圾收集。

如果没有,这听起来像是一个坏了的垃圾收集器。

是的,委托将作为引用计数。在委托也无法访问之前,不会对对象进行垃圾收集

是的,该引用仍然有效,事实上可以使用Delegate.Target属性进行检索——在您的代码中,正如其他人所说的那样,它被视为引用。你可能会发现这个故事很有趣。

哇,太可笑了,我忘了放那些标签了。。。是的,修好了。哇,那是。。。真该死。