5

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

}
4

3 回答 3

9

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

new MyDelegate(AddNumbers)

你通常可以说只是

AddNumbers

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

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

于 2013-02-22T12:03:11.407 回答
2

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

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

所以这:

MyDelegate myDel = new MyDelegate(AddNumbers);

设置myDelMulticastDelegate具有单个目标的 a。但是这一行:

myDel += new MyDelegate(MultiplyNumbers);

更新myDelMulticastDelegate具有两个目标的 a。

于 2015-07-02T12:32:44.073 回答
1

Multicast delegates是delegate的特性之一,它封装了多个方法的引用并顺序调用,也称为Delegate Chaining。

下面是多播委托的示例。

    // 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();
    }
}
于 2017-04-01T18:53:22.963 回答