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