例如:
delegate void SomeDelegate();
SomeDelegate a = new SomeDelegate( () => Console.WriteLine("A") );
SomeDelegate b = new SomeDelegate( () => Console.WriteLine("B") );
SomeDelegate c = a + b;
在最后一行,a + b
翻译成什么?我只是好奇如何在不使用+
运算符的情况下添加它们。
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()
方法将两个委托添加在一起。
它是使用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;
MulticastDelegate
class(delegate
关键字后面的类)确实有一个调用列表,但这个列表是不可变的。每次将委托与运算符组合时,都会创建一个结合前两个 Delegate 对象的调用列表的+=
新实例。MulticastDelegate