一个委托类型实列不仅可以绑定一个方法,其实可以实现多个方法的绑定,即多播委托,或委托链。
如下:
namespace 多播委托
{//定义具有反回值无参数的委托类型变量
public delegate int weito();
class Program
{
static void Main(string[] args)
{//建立对应委托类型实列,并指定方法,通过增加方式,实现委托多播。
//委托执行一般按照增加方法的顺序进行。
weito kk = new weito(M1);
kk += M2;
kk += M3;
kk += M4;
Console.WriteLine(kk());//具有反回值的多播委托,最终只能返回最后添加方法的返回值。
Console.WriteLine("------------------遍历取得多播委托方法反回值-----------------");
Delegate[] delkks = kk.GetInvocationList();
//可能通过遍历,调用委托中每个方法,实现分步获取委托中的返回值。
//可以通过.GetInvocationList()方式获得当前委托中存储的所有方法。
//其反回值类型是一个Delegate[]数组(委托数组)
//其所有反回的委托均继承自抽像类MultiCastdelegate,而MultiCastdelegage又继承自抽像类Delegate。
//多播委托内部是将绑定在委托内部的多个方法,强制转换成了一个委托对象,并且将其存储在了一个叫_invocationList的object数组中。
//当调用委托时,遍历object数组,执行相对应的函数。
foreach (Delegate itemdelegate in delkks)
{
weito method = (weito)itemdelegate;
int k = method();
Console.WriteLine(k);
}
Console.ReadKey();
}
static int M1()
{
return 1;
}
static int M2()
{
return 2;
}
static int M3()
{
return 3;
}
static int M4()
{
return 4;
}
}
}
注意:1、当多播委托绑定的方法有出现异常时,则此方法以后的方法不再执行。
2、委托进行方法增加或去除绑定只能用‘+=’或‘-=‘,如果直接使用‘=’则会将该委托变量绑定的所有方法覆盖掉。
3、多播委托绑定的第一个方法只能用‘+=‘。
4、委托同string一样,具有不可变的特性。
多播委托内存分配原理图(delegate k=new delegate(M1);k+=k2;)