简单委托(委托)与组播委托

我已经阅读了许多文章,但是我仍然不清楚我们通常创build的普通代表和多播代表之间的区别。

public delegate void MyMethodHandler(object sender); MyMethodHandler handler = new MyMethodHandler(Method1); handler += Method2; handler(someObject); 

上面的委托MyMethodHandler将调用这两个方法。 现在,组播代表进来了。我已经读了他们可以调用多种方法,但是我担心对代表的基本理解是不正确的。

这篇文章解释得非常好:

 delegate void Del(string s); class TestClass { static void Hello(string s) { System.Console.WriteLine(" Hello, {0}!", s); } static void Goodbye(string s) { System.Console.WriteLine(" Goodbye, {0}!", s); } static void Main() { Del a, b, c, d; // Create the delegate object a that references // the method Hello: a = Hello; // Create the delegate object b that references // the method Goodbye: b = Goodbye; // The two delegates, a and b, are composed to form c: c = a + b; // Remove a from the composed delegate, leaving d, // which calls only the method Goodbye: d = c - a; System.Console.WriteLine("Invoking delegate a:"); a("A"); System.Console.WriteLine("Invoking delegate b:"); b("B"); System.Console.WriteLine("Invoking delegate c:"); c("C"); System.Console.WriteLine("Invoking delegate d:"); d("D"); } } /* Output: Invoking delegate a: Hello, A! Invoking delegate b: Goodbye, B! Invoking delegate c: Hello, C! Goodbye, C! Invoking delegate d: Goodbye, D! */ 

C#规范指出,所有委托types都必须转换为System.Delegate 。 实际上,实现这个的方式是所有委托types都是从System.MulticastDelegate派生的,而System.MulticastDelegate派生自System.Delegate

明白了吗? 我不确定你是否回答了你的问题。

“所有委托实例都具有组播function。” – http://msdn.microsoft.com/en-us/library/orm-9780596527570-03-04.aspx

“在C#中,所有委托types都支持多播” – http://msdn.microsoft.com/zh-cn/library/orm-9780596516109-03-09.aspx

对不起,添加到别人的答案,但我认为委托他们被添加的顺序调用。

“多播代表”部分

http://msdn.microsoft.com/en-us/library/orm-9780596527570-03-04.aspx

澄清一点: 所有委托都是MulticastDelegate类的实例,不pipe它们是否有一个或多个目标方法。 原则上,具有单个目标或多个目标的代理之间没有区别,尽pipe运行时对单个目标常见情况稍微优化。 (0目标的代表是不可能的,但它是一个或多个)。

当你实例化一个委托像new MyMethodHandler(Method1) ,你创build一个具有单个目标的委托( Method1方法)。

具有多个目标的代表通过组合两个现有的代表来创build。 由此产生的代表将有目标的总和。 委托可以与Delegate.Combine()显式组合,但也可以通过在现有的委托上使用+=运算符来隐式地组合。

调用委托反过来调用委托中的每个目标。 所以在你的示例handler(someObject); 将调用两个方法( Method1Method1 ),因为您已经创build了具有这两个目标的委托。