一、委托的含义
委托是类型安全的,可以订阅一个或多个具有相同签名方法的函数指针。委托可以把函数做为参数传递,其实际意义便是让别人代理你的事情。委托可以看做是函数的指针,整数可以用整数变量指向它,对象可以用对象变量指向它,函数也可以用委托变量指向它。我们可以选择将委托类型看做只定义了一个方法的接口,而委托的实例可以看做是实现了那个接口的一个对象。
委托是将函数指针和实例对象打包在一起的类,它有两个重要的成员,一个用来保存实例对象,一个用来保存函数的指针。委托又分为委托静态方法和委托实例方法。
多播委托:是指在一个委托中注册多个方法,在注册方法时可以在委托中使用加号运算符或者减号运算符来实现添加或撤销方法。使用委托的这个有用的特点,可以创建一个委托被调用时要调用的方法的调用列表。 这被称为委托的多播(multicasting),也叫组播。
二、使用委托的条件
(1)声明委托类型;
(2)必须有一个方法包含了要执行的代码;
(3)必须创建一个委托实例;
(4)必须调用(invoke)委托实例。
三、委托的申明
(1)声明委托的方式:delegate 返回值类型 委托类型名(参数)
委托的申明和接口方法的申明基本上一致,只是在返回类型关键字的前面多了一个delegate关键字。委托一般声明为public类型,因为它随时要供别人调用。参数可以自己定义。
有如下四种委托:
1.无参数无返回值 public delegate void NoParaNoReturnEventHandler();
2.有参数无返回值 public delegate void WithParaNoReturnEventHandler(string name);
3.无参数有返回值 public delegate string NoParaWithReturnEventHandler();
4.有参数有返回值 public delegate string WithParaWithReturnEventHandler(string name);
(2)声明好了委托后就必须要创建和委托参数和返回值一致的方法。
(3)实例化委托:
委托的本质也是一个类型。我们声明一个类可以进行实例化,同样委托也可以进行实例化。
下面来看一个例子:
public void Mul(int a)
{
Conslone.WriteLine(a*a);
}
//在这里声明了一个委托,参数是一个整型a,返回a*a的值
DelegateMethod dele=new DelegateMethod(Mul);
// 上面这句话即使将Mul变成了委托,即只要是一个整型的数,经过此委托都会返回a*a的值。
执行委托:
即int result=dele(10);
那么result的值就是100。
四、委托的调用
(1)同步调用
a、同步调用会按照代码顺序来执行
b、同步调用会阻塞线程,如果是要调用一项繁重的工作(如大量IO操作),可能会让程序停顿很长时间,造成糟糕的用户体验,这时候异步调用就很有必要了。
(2)异步调用
a、异步调用不阻塞线程,而是把调用塞到线程池中,
b、程序主线程或UI线程可以继续执行。
c、委托的异步调用通过BeginInvoke和EndInvoke来实现。
(3)异步回调
用回调函数,当调用结束时会自动调用回调函数,解决了为等待调用结果,而让线程依旧被阻塞的局面。
五、系统内置委托
(1)Action委托(不需要返回值)
a、Action委托:封装一个方法,该方法不具有参数并且不返回值
b、Action<T>委托:封装一个方法,该方法只有一个参数并且不返回值
c、Action<T1,T2>委托:封装一个方法,该方法具有两个参数并且不返回值
(2)Func委托(需要返回值,其中的T是参数类型,R是返回值类型)
a、Func(R)委托:封装一个不具有参数但却返回 R 参数指定的类型值的方法
b、Func(T,R)委托:封装一个具有一个参数并返回 R 参数指定的类型值的方法
c、Func(T1,T2,R)委托:封装一个具有两个参数并返回 R 参数指定的类型值的方法
————————————————
版权声明:本文为CSDN博主「遥寄山海」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_74013796/article/details/134130480