例如:
delegate void SomeDelegate();
SomeDelegate a = new SomeDelegate( () => Console.WriteLine("A") );
SomeDelegate b = new SomeDelegate( () => Console.WriteLine("B") );
SomeDelegate c = a + b;
在最后一行,什么是a + b
转换为? 我只是好奇,我怎么会添加它们不使用+
运算符。
例如:
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包含其调用列表方法1,方法2,和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
类(后面的类delegate
关键字)确实有调用的名单,但这个名单是不可改变的。 每次用结合代表时间+=
运营商,新MulticastDelegate
实例获得创建结合了前两种委托对象的调用列表。