一.委托的概念
C#中委托也叫代理,委托提供了后期绑定机制(官方解释),功能类似于C++中的函数指针,它存储的就是一系列具有相同签名和返回类型的方法的地址,调用委托的时候,它所包含的所有方法都会被执行。
二.委托的用法
1.声明委托
语法:修饰符 delegate <函数返回类型> <委托名> (<函数参数>)
2.类似于创建对象,委托实例化,将实例化一样签名的函数名作为参数传进"构造函数"
3.调用委托
a.像调用函数一样调用委托
b.通过Invoke调用委托
namespace Console0719
{class Program{public class DelegateTest{public static int add10(int a){return 10 + a;}public static int add5(int a){return 5 + a;}}//step1:声明委托(类似函数签名,无需实现)public delegate int Cal(int a);static void Main(string[] args){//step2.声明委托实例,将实例化一样签名的函数名作为参数传进小括号Cal cal1 = new Cal(DelegateTest.add10);//step3.像调用函数一样调用委托Console.WriteLine(cal1(3)); //输出13 cal1 = new Cal(DelegateTest.add5);//step3.通过Invoke()调用委托Console.WriteLine(cal1.Invoke(3)); //输出8}}
}
三.委托的作用
1.回调函数
step1:函数中将委托的实例作为参数
step2:函数中调用委托
step3:将恰当的回调函数作为实参
namespace Console0719
{class Program{delegate void DelegateDone();static void Main(string[] args){Program test = new Program();//step3:将恰当的回调函数作为实参test.Work(CallBack);}//step1:函数中将委托的实例作为参数void Work(DelegateDone callBack){Console.WriteLine("回调执行之前");//step2:函数中调用委托callBack();}static void CallBack(){Console.WriteLine("回调执行成功");}}
}
2.提高代码复用性
3.降低耦合度,提升扩展性
四.委托的多播
委托可以调用多个方法,这被称为多播。 若要向委托的方法列表(调用列表)添加其他方法,只需使用加法运算符或加法赋值运算符(“+”或“+=”)添加两个委托,“-=”撤销委托。 例如:
namespace Console0719
{class Program{public delegate void DelTest();static void Main(string[] args){Program test = new Program();DelTest del1 = new DelTest(work1);DelTest del2 = new DelTest(work2);DelTest del3 = del1 + del2;Console.WriteLine("+=结果:");del1 += work3;del1();Console.WriteLine("");//输出work1 work3Console.WriteLine("+结果:");del3();Console.WriteLine("");//输出work1 work2Console.WriteLine("-=结果:");del3 -= work1;del3();Console.WriteLine("");//输出work2}//step1:函数中将委托的实例作为参数static void work1(){Console.WriteLine("work1");}static void work2(){Console.WriteLine("work2");}static void work3(){Console.WriteLine("work3");}}
}