组播代理C#

我正在研究代表们。 在我读的时候。 我了解到在委托中添加多个函数称为多播委托。 基于此,我写了一个程序。 这里我在MyDelegate中添加了两个函数(AddNumbers和MultiplyNumbers)。 以下程序是多播委托的示例吗?

public partial class MainPage : PhoneApplicationPage { public delegate void MyDelegate(int a, int b); // Constructor public MainPage() { InitializeComponent(); MyDelegate myDel = new MyDelegate(AddNumbers); myDel += new MyDelegate(MultiplyNumbers); myDel(10, 20); } public void AddNumbers(int x, int y) { int sum = x + y; MessageBox.Show(sum.ToString()); } public void MultiplyNumbers(int x, int y) { int mul = x * y; MessageBox.Show(mul.ToString()); } } 

是的,它是多播委托的一个例子。 请注意,而不是

 new MyDelegate(AddNumbers) 

你通常可以说只是

 AddNumbers 

因为存在所谓的方法组转换,它将为您创建委托实例。

另一件需要注意的是你的声明public delegate void MyDelegate(int a, int b); 不必驻留在另一个类型内(这里是MainPage类)。 它可以是命名空间的直接成员(因为它是一种类型)。 但是当然,将它“嵌套”在一个类中是完全有效的,就像你创建类似于创建嵌套类的原因一样。

实际上,C#中的所有代理都是MulticastDelegates,即使它们只有一个方法作为目标。 (即使匿名函数和lambdas也是MulticastDelegates,即使它们按定义只有单个目标。)

MulticastDelegate只是C#中各种函数或方法引用的基类,无论它们是否包含一个或多个目标。

所以这:

 MyDelegate myDel = new MyDelegate(AddNumbers); 

myDel设置为具有单个目标的MulticastDelegate 。 但这一行:

 myDel += new MyDelegate(MultiplyNumbers); 

使用两个目标将myDel更新为MulticastDelegate

多播委托是委托的function之一,它包含多个方法的引用并按顺序调用它,它也称为委托链。

以下是多播代理的示例。

  // Declare Delegates public delegate void MultiCast(int num1, int num2); class Program { public void Add(int num1, int num2) { Console.WriteLine(num1 + num2); } public void Sub(int num1, int num2) { Console.WriteLine(num1 - num2); } public void Mul(int num1, int num2) { Console.WriteLine(num1 * num2); } static void Main(string[] args) { MultiCast del1, del2, del3, multAddDel, multSubDel; del1 = new Program().Add; del2 = new Program().Sub; del3 = new Program().Mul; //`There are three ways to define the multicast delegate.` //1 way //Adding delegates multAddDel = del1 + del2 + del3; multAddDel(10, 10); //Removing Delegates multSubDel = multAddDel - del3; multSubDel(10, 10); Console.WriteLine(); Console.WriteLine("Second Way"); //2 way MultiCast multAddDel1 = null; //Adding delegates multAddDel1 += del1; multAddDel1 += del2; multAddDel1 += del3; multAddDel1(10, 10); //Removing Delegates multAddDel1 -= del3; multAddDel1(10, 10); Console.WriteLine(); Console.WriteLine("Third Way"); //3 way MultiCast multAddDel2 = null; //Adding delegates multAddDel2 = (MultiCast)Delegate.Combine(multAddDel2, del1); multAddDel2 = (MultiCast)Delegate.Combine(multAddDel2, del2); multAddDel2 = (MultiCast)Delegate.Combine(multAddDel2, del3); multAddDel2(10, 10); //Removing Delegates multAddDel2 = (MultiCast) Delegate.Remove(multAddDel2, del3); multAddDel2(10, 10); Console.ReadLine(); } }