说明:1、多播委托就是对一个声明的委托Mydelegate进行多个同类型的方法的赋值;
2、用委托将这些方法进行,依次的调用;
3、可以对这些方法进行委托的添加 比如:mdl =T1;
4、可以对这些方法进行委托的移除 比如:mdl-=T1;
5、委托用之前还要判断是否为空;(很重要!)
1、使用委托的两种写法:
代码语言:javascript复制第一种写法:
MyDel mdl = new MyDel(T1);
第二种写法:
MyDel mdl = T1;//第二种写法,其实方法是一样的,反编译工具看,=后边也是被new 出来的
2、当然还可以进行添加,和,移除方法
mdl = T2; //可以添加
mdl = T3;
mdl -=T2; //可以移除
3、委托用之前,需要判断是否为null,
代码语言:javascript复制if (mdl!=null)//4、委托用之前,需要判断是否为null,这个很重要的!!
{
mdl();
}
附:
代码语言:javascript复制using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 多播委托
{
//2、定义委托
public delegate void MyDel();
class Program
{
static void Main(string[] args)
{
//3、第一种写法:
// MyDel mdl = new MyDel(T1);
MyDel mdl = T1;//第二种写法,其实方法是一样的,反编译工具看,=后边也是被new 出来的
mdl = T2; //可以添加
mdl = T3;
mdl -=T2; //可以移除
if (mdl!=null)//4、委托用之前,需要判断是否为null,这个很重要的!!
{
mdl();
}
Console.ReadKey();
}
//1、先定义三个方法 T1、T2、T3
public static void T1()
{
Console.WriteLine("第一个方法");
}
public static void T2()
{
Console.WriteLine("第二个方法");
}
public static void T3()
{
Console.WriteLine("第三个方法");
}
}
}
多播委托链
1、问题:多播委托如何处理返回值?
回答:多播委托会只将最后一个委托方法的结果输出来;
2、验证:
代码语言:javascript复制using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 多播委托链
{
//2、定义委托
public delegate int Mydel();
class Program
{
static void Main(string[] args)
{//调用
Mydel mdl = D1;
mdl = D2;
mdl = D3;
if (mdl!=null)
{
mdl();
}
Console.WriteLine(mdl());//可以看到这里只是打印出来了第三个方法的结果
Console.ReadKey();
}
//1、先定义三个有返回值的方法
public static int D1()
{
return 1;
}
public static int D2()
{
return 2;
}
public static int D3()
{
return 3;
}
}
}
F11逐步调试,mdl是先被赋值上方法T1、T2、T3、,最后又按顺序再调用了方法,T3方法是最后执行的。
总结:
1、委托绑定多个方法后,其中一个方法执行发生异常后面的方法还会继续执行吗?不会!
2、一个重要的方法GetInvocationList();//返回一个Delegate[]类型。Delegate类是一个抽象类,是所有委托的父类。
3、组合的委托必须是同一个类型
:
4、相当于创建了一个按照组合的顺序依次调用的新委托对象。
5、委托的组合一般是给事件用的,用普通的委托的时候很少用