如何对组合代表+运算符的工作?(How does the + operator work for c

2019-08-03 04:23发布

例如:

delegate void SomeDelegate();

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

SomeDelegate c = a + b;

在最后一行,什么是a + b转换为? 我只是好奇,我怎么会添加它们不使用+运算符。

Answer 1:

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包含其调用列表方法1,方法2,和DelegateMethod三种方法。 原来的三个委托,D1,D2和D3,保持不变。 当allMethodsDelegate被调用,所有这三种方法都叫做秩序。 如果委托使用参考参数,参考被顺序传递给每个依次三种方法中的,和通过一种方法的任何改变都将下一个方法是可见的。 当任何方法抛出未在方法中捕获的异常,该异常被传递给委托的调用者和调用列表没有后续的方法调用。

更新

双方代表派生自System.Delegate您可以使用combine()方法来两名代表相加。



Answer 2:

它是用做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实例获得创建结合了前两种委托对象的调用列表。



文章来源: How does the + operator work for combining delegates?
标签: c# delegates