什么是委托?
委托使是C#1.0中出现的功能语法,他可以方法当成参数传递,这是其他语言不具有的功能。
委托的作用?
首先委托是类型安全的(类型安全代码指访问被授权可以访问的内存位置)。委托在编译过后实际上是一个类,这个类继承自:System.MulticastDelegate类,这个类是一个特殊类,不能被外部类继承 ,委托的提出方便了方法的扩展和逻辑的解耦。
委托的使用?
委托的声明
// 委托用关键字degelate声明
// 声明的委托不能重载
// 声明一个无参数无返回的委托
public delegate void getMethod();
// 声明一个有参数无返回值的委托
public delegate void getMethod1(int q);
// 声明一个无参数有返回值的委托
public delegate int getMethod2();
// 声明一个有参数有返回值的委托
public delegate int getMethod3(int q);
委托可以在类中声明,也可以在类外声明。
委托的实例化
//实例化委托,传入一个方法作为委托方法,方法的参数与返回值必须和声明委托的方法和返回值一样
getMethod degelateMethod1 = new getMethod(Method1);
getMethod1 degelateMethod2 = new getMethod1(Method2);
getMethod2 degelateMethod3 = new getMethod2(Method3);
getMethod3 degelateMethod4 = new getMethod3(Method4);
委托的调用
// 委托的调用可以使用Invoke()方法,也可以使用简写。
// 调用的时候,参数可以传入,返回值可以声明变量接收。
degelateMethod1.Invoke();
// 简写方法
degelateMethod1();
degelateMethod2(1);
degelateMethod3();
degelateMethod4(1);
泛型委托Func与Action
C#2.0的泛型出现,泛型委托也随之出现了,泛型委托的出现,极大的解决了泛型委托类型的不一致问题和代码的复用性问题,随之也出现了Func泛型委托与Action泛型委托,这两种委托是内置的泛型委托的类型,可以直接使用。当然还内置了其他的泛型委托,但是这两种委托已经覆盖了所有的委托使用情况,其他的也就逐渐的废弃掉了。
Func委托
// 这是内置的func委托。Func委托是有返回值的,默认最后一个参数是返回值。无论是func委托还是action委托的参数默认最多16个。
Func<int, int> x = new Func<int, int>(Method4);
Action委托
// 这是内置的action委托,action委托是有参数无返回值的。
Action<int> A = new Action<int>(Method2);
调用委托方法与普通的委托方法是相同的。
多播委托
默认委托继承System.MulticastDelegate,也就是多播委托,所以委托默认是多播的。
Action<int> A = new Action<int>(Method2);
A += Method2;
A += Method2;
A -= Method2;
用+=或-=这两个符号可以制造方法链,委托执行的时候会按添加的次序一次执行链上的方法。当多播委托中的方法有返回值的时候,接收会使最后一个方法的返回值。
异步委托多线程
委托可以用BeginInvoke的方法来将方法用异步线程的方式启动。
具体的使用方法可以在多线程的章节查看。
Lambda表达式
lambda表达式本质上就是一个匿名方法,在C#3.0的时候出现的。最常用的就是配合委托使用。
// 形如
()=>{
}
//这就是一个匿名方法。
注意:一lambda形式在多播委托中使用是移除不了的。
事件
//事件
event Action<int> Action = new Action<int>(Method2);
事件就是在委托的实例上加event关键字,
与多播委托的区别就是防止外部去invoke和赋值,子类也不可以。
事件是委托的进一步限制。
委托与事件的区别和联系:
事件是委托的实例,委托是一个类型,而事件是一个实例。