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属性进行检索——在您的代码中,正如其他人所说的那样,它被视为引用。你可能会发现这个故事很有趣。
哇,太可笑了,我忘了放那些标签了。。。是的,修好了。哇,那是。。。真该死。