链接.NET委托时,原始实例(重新)如何使用?

时间:2009-03-12 10:32:39

标签: c# .net delegates chaining instances

说我有以下C#代码:

Action a = TestMethod;
Action b = TestMethod;
Action c = b;
b += a;

测试表明bc不是同一个实例,因此+运算符似乎创建了一个新的委托实例。这是正确的假设吗?它是在内部重用b - 实例,还是仅将方法/目标信息复制到新实例?

我似乎无法为委托找到+运算符的实现,Delegate类似乎不包含它。

有人能解释一下这个问题吗?

我问的原因是我正在创建一些类,它们将像洋葱一样彼此分层,最外层将调用内层,获取一些代理,然后将更多方法附加到这些代理,我我只关心这样做会以某种方式改变我从内层获得的委托,在这种情况下我需要返回副本/克隆,而不仅仅是内部引用。

请注意,这是我的库的完全内部代码,所以虽然我知道传递这样的内部数据结构通常是个坏主意,如果我可以安全地使用这些类,那么我会这样做。

2 个答案:

答案 0 :(得分:4)

+=相当于Delegate.Combine()-=相当于Delegate.Remove()。每个都创建一个新的Delegate实例并返回它。

答案 1 :(得分:4)

正如肯特所说,+ =使用Delegate.Combine, - =使用Delegate.Remove。有关详细信息,请参阅我的events/delegates article

重要的是委托是不可变的 - 调用Combine / Remove不会改变你调用它的委托 - 所以你不需要克隆任何东西。您对委托执行的任何操作都是如此:例如,如果您获得调用列表并更改返回数组的内容,则不会更改委托实际执行的操作。

(这就像String的行为,如果你想要另一种思考方式。)