+运算符如何用于组合代理?

时间:2012-11-25 07:07:51

标签: c# delegates

例如:

delegate void SomeDelegate();

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

SomeDelegate c = a + b;

在最后一行,a + b转化为什么?我很好奇如何在不使用+运算符的情况下添加它们。

2 个答案:

答案 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对象的调用列表。