1.委托是什么?
委托本质上是一个类,继承自System.MulticastDelegate,里面内置了几个方法。
注意:委托传递的方法的返回值和参数,必须与委托一致,声明的委托可以放在类里面,也可以放在类外面。
2.委托三部曲
//声明委托
public delegate void NoReturnNoPara<T>(T t);
public delegate void NoReturnNoPara();
public delegate void NoReturnWithPara(int x, int y);//1 声明委托
public delegate int WithReturnNoPara();
public delegate string WithReturnWithPara(out int x, ref int y);
//委托实例化
NoReturnNoPara method = new NoReturnNoPara(this.DoNothing);
//委托的调用
method.Invoke();
method();
3.异步调用与带返回值的委托
WithReturnNoPara method = new WithReturnNoPara(this.GetSomething);//实例化
int iResult = method.Invoke();//带返回值的委托调用
iResult = method();
var result = method.BeginInvoke(null, null);//异步调用
method.EndInvoke(result);
4.多播委托
//多播委托:一个变量保存多个方法,可以增减;invoke的时候可以按顺序执行
//+= 为委托实例按顺序增加方法,形成方法链,Invoke时,按顺序依次执行
Student studentNew = new Student();
NoReturnNoPara method = new NoReturnNoPara(this.DoNothing);
method += new NoReturnNoPara(this.DoNothing);
method += new NoReturnNoPara(DoNothingStatic);
method += new NoReturnNoPara(Student.StudyAdvanced);
method += new NoReturnNoPara(new Student().Study);//不是同一个实例,所以是不同的方法
method += new NoReturnNoPara(studentNew.Study);
method.Invoke();
//method.BeginInvoke(null, null);//多播委托是不能异步的
foreach (NoReturnNoPara item in method.GetInvocationList())
{
item.Invoke();
//item.BeginInvoke(null, null);
}
//-= 为委托实例移除方法,从方法链的尾部开始匹配,遇到第一个完全吻合的,移除且只移除一个,没有也不异常
method -= new NoReturnNoPara(this.DoNothing);
method -= new NoReturnNoPara(DoNothingStatic);
method -= new NoReturnNoPara(Student.StudyAdvanced);
method -= new NoReturnNoPara(new Student().Study);
method -= new NoReturnNoPara(studentNew.Study);
method.Invoke();
5.多播委托带返回值
WithReturnNoPara method = new WithReturnNoPara(this.GetSomething);
method += new WithReturnNoPara(this.GetSomething2);
method += new WithReturnNoPara(this.GetSomething3);
int iResult = method.Invoke();//多播委托带返回值,结果以最后的为准
6.委托的意义
逻辑解耦,在特定的场景,可以提炼出公共逻辑封装,将不同部分的逻辑当参数传递。