组播代理C#

时间:2013-02-22 11:59:01

标签: c# delegates

正在研究代表们。在我读的时候。我了解到在委托中添加多个函数称为多播委托。基于此,我写了一个程序。这里我在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());
    }

}

3 个答案:

答案 0 :(得分:8)

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

new MyDelegate(AddNumbers)

你通常可以说

AddNumbers

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

另一件需要注意的事情是,您的声明public delegate void MyDelegate(int a, int b); 不能驻留在另一个类型中(此处位于MainPage类内)。它可以是命名空间的直接成员(因为它是一种类型)。但是当然,正如你所做的那样,将它“嵌套”在一个类中是完全有效的,原因类似于你创建嵌套类的原因。

答案 1 :(得分:2)

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

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

所以这个:

MyDelegate myDel = new MyDelegate(AddNumbers);

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

myDel += new MyDelegate(MultiplyNumbers);

myDel更新为具有两个目标的MulticastDelegate

答案 2 :(得分:1)

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

以下是多播代理的示例。

    // 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();
    }
}