委托声明定义一个从 System.Delegate
类派生的类。委托实例封装一个调用列表,该列表列出一个或多个方法,其中每个方法均作为一个可调用实体来引用。对于实例方法,可调用实体由该方法和一个相关联的实例组成。对于静态方法,可调用实体仅由一个方法组成。用一个适当的参数集来调用一个委托实例,就是用此给定的参数集来调用该委托实例的每个可调用实体。
多播委托是指引用多个方法委托。当调用委托时,它连续调用每个方法。为了把委托的单个实例合并为一个多播委托,委托必须是同类型的。除此之外,它们的声明和实例化都和单播委托没有什么不同。多播委托用于C#的事件模型中。
可以把多播委托看作两个或多个标准委托串在一起。委托可以使用算术运算符+和+=串在一起。委托也能使用-和-=运算符从多播委托中删除。当调用多播委托里,委托所表示的每个方法依次调用。如果有任何参数,它们将用于所有的方法。
特别注意:多播委托所调用的方法可以具有返回值,但是我们只能获得最后一个方法的执行结果。
测试代码如下:
using System;
namespace DelegateTest
{
public delegate int MyDelegate(int x,int y);
class DelegateClass
{
static void Main(string[] args)
{
DelegateClass dc= new DelegateClass();
MyDelegate md =new MyDelegate(dc.Add);
md+=new MyDelegate(dc.Sub);
md+=new MyDelegate(dc.Sub);
md+=new MyDelegate(dc.Sub);
md-=new MyDelegate(dc.Sub);
int i = md(1,1);
Console.WriteLine(“委托的执行结果是:”i);
}
int Add(int x,int y)
{
Console.WriteLine("X + Y= "+(x+y).ToString());
return 0;
}
int Sub(int x,int y)
{
Console.WriteLine("X - Y= "+(x-y).ToString());
return 1;
}
}
}
执行结果:
X+Y =2
X-Y = 0
X-Y = 0
委托的执行结果是:1