10

例如:

delegate void SomeDelegate();

SomeDelegate a = new SomeDelegate( () => Console.WriteLine("A") );
SomeDelegate b = new SomeDelegate( () => Console.WriteLine("B") );

SomeDelegate c = a + b;

在最后一行,a + b翻译成什么?我只是好奇如何在不使用+运算符的情况下添加它们。

4

2 回答 2

7

http://msdn.microsoft.com/en-us/library/ms173172(v=VS.80).aspx - 搜索添加:

一个委托在被调用时可以调用多个方法。这称为多播。要向委托的方法列表(调用列表)添加额外的方法,只需使用加法或加法赋值运算符(“+”或“+=”)添加两个委托。例如:

MethodClass obj = new MethodClass(); 
Del d1 = obj.Method1; 
Del d2 = obj.Method2; 
Del d3 = DelegateMethod;

//Both types of assignment are valid. 
Del allMethodsDelegate = d1 + d2; 
allMethodsDelegate += d3;

此时 allMethodsDelegate 在其调用列表中包含三个方法——Method1、Method2 和 DelegateMethod。原来的三个代表 d1、d2 和 d3 保持不变。调用 allMethodsDelegate 时,依次调用所有三个方法。如果委托使用引用参数,则引用依次传递给三个方法中的每一个,并且一个方法的任何更改对下一个方法都是可见的。当任何方法抛出未在方法中捕获的异常时,该异常将传递给委托的调用者,并且不会调用调用列表中的后续方法。

更新

两个委托都派生自System.Delegate您可以使用这些combine()方法将两个委托添加在一起。

于 2012-11-25T07:15:13.363 回答
4

它是使用Delegate.Combine静态方法完成的。

SomeDelegate c = Delegate.Combine(a, b) as SomeDelegate;

使用+=运算符时实际上是一样的。

// This is the same...
eventSource.onEvent += OnEvent;

// ...as this.
eventSource.onEvent = Delegate.Combine(
    eventSource.onEvent,
    Delegate.CreateDelegate(typeof(EventSource.OnEvent), this, "OnEvent")
    ) as EventSource.OnEvent;

MulticastDelegateclass(delegate关键字后面的类)确实有一个调用列表,但这个列表是不可变的。每次将委托与运算符组合时,都会创建一个结合前两个 Delegate 对象的调用列表的+=新实例。MulticastDelegate

于 2015-07-22T02:21:50.483 回答