说我有以下C#代码:
Action a = TestMethod;
Action b = TestMethod;
Action c = b;
b += a;
测试表明b
与c
不是同一个实例,因此+
运算符似乎创建了一个新的委托实例。这是正确的假设吗?它是在内部重用b
- 实例,还是仅将方法/目标信息复制到新实例?
我似乎无法为委托找到+
运算符的实现,Delegate类似乎不包含它。
有人能解释一下这个问题吗?
我问的原因是我正在创建一些类,它们将像洋葱一样彼此分层,最外层将调用内层,获取一些代理,然后将更多方法附加到这些代理,我我只关心这样做会以某种方式改变我从内层获得的委托,在这种情况下我需要返回副本/克隆,而不仅仅是内部引用。
请注意,这是我的库的完全内部代码,所以虽然我知道传递这样的内部数据结构通常是个坏主意,如果我可以安全地使用这些类,那么我会这样做。
答案 0 :(得分:4)
+=
相当于Delegate.Combine()
。 -=
相当于Delegate.Remove()
。每个都创建一个新的Delegate
实例并返回它。
答案 1 :(得分:4)
正如肯特所说,+ =使用Delegate.Combine
, - =使用Delegate.Remove
。有关详细信息,请参阅我的events/delegates article。
重要的是委托是不可变的 - 调用Combine / Remove不会改变你调用它的委托 - 所以你不需要克隆任何东西。您对委托执行的任何操作都是如此:例如,如果您获得调用列表并更改返回数组的内容,则不会更改委托实际执行的操作。
(这就像String的行为,如果你想要另一种思考方式。)