例如:
delegate void SomeDelegate();
SomeDelegate a = new SomeDelegate( () => Console.WriteLine("A") );
SomeDelegate b = new SomeDelegate( () => Console.WriteLine("B") );
SomeDelegate c = a + b;
在最后一行,a + b
转化为什么?我很好奇如何在不使用+
运算符的情况下添加它们。
答案 0 :(得分:5)
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()
方法将两个代表添加到一起。
答案 1 :(得分:3)
使用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
类(delegate
关键字后面的类)确实有一个调用列表,但是这个列表是不可变的。每次将代理与+=
运算符组合在一起时,就会创建一个新的MulticastDelegate
实例,并结合前两个Delegate对象的调用列表。