2

假设我有以下 C# 代码:

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

测试表明 与b不是同一个实例c,因此显然+操作员似乎创建了委托的新实例。这是一个正确的假设吗?它是在b内部重用 -instance,还是只是将方法/目标信息复制到新实例?

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

任何人都可以对这个问题有所了解吗?

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

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

4

2 回答 2

4

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

于 2009-03-12T10:35:55.803 回答
4

正如肯特所说, += 使用 to Delegate.Combine, -= 使用Delegate.Remove。有关更多信息,请参阅我的活动/代表文章

重要的是委托是不可变的——调用组合/删除根本不会改变你调用它的委托——所以你不需要克隆任何东西。对于您对委托执行的任何其他操作也是如此:例如,如果您获取调用列表并更改返回数组的内容,则不会改变委托实际执行的操作。

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

于 2009-03-12T10:37:42.370 回答