什么是委托?

委托使是C#1.0中出现的功能语法,他可以方法当成参数传递,这是其他语言不具有的功能。

委托的作用?

首先委托是类型安全的(类型安全代码指访问被授权可以访问的内存位置)。委托在编译过后实际上是一个类,这个类继承自:System.MulticastDelegate类,这个类是一个特殊类,不能被外部类继承 ,委托的提出方便了方法的扩展和逻辑的解耦。

委托的使用?

委托的声明

  1. // 委托用关键字degelate声明
  2. // 声明的委托不能重载
  3. // 声明一个无参数无返回的委托
  4. public delegate void getMethod();
  5. // 声明一个有参数无返回值的委托
  6. public delegate void getMethod1(int q);
  7. // 声明一个无参数有返回值的委托
  8. public delegate int getMethod2();
  9. // 声明一个有参数有返回值的委托
  10. public delegate int getMethod3(int q);

委托可以在类中声明,也可以在类外声明。

委托的实例化

  1. //实例化委托,传入一个方法作为委托方法,方法的参数与返回值必须和声明委托的方法和返回值一样
  2. getMethod degelateMethod1 = new getMethod(Method1);
  3. getMethod1 degelateMethod2 = new getMethod1(Method2);
  4. getMethod2 degelateMethod3 = new getMethod2(Method3);
  5. getMethod3 degelateMethod4 = new getMethod3(Method4);

委托的调用

  1. // 委托的调用可以使用Invoke()方法,也可以使用简写。
  2. // 调用的时候,参数可以传入,返回值可以声明变量接收。
  3. degelateMethod1.Invoke();
  4. // 简写方法
  5. degelateMethod1();
  6. degelateMethod2(1);
  7. degelateMethod3();
  8. degelateMethod4(1);

泛型委托Func与Action

C#2.0的泛型出现,泛型委托也随之出现了,泛型委托的出现,极大的解决了泛型委托类型的不一致问题和代码的复用性问题,随之也出现了Func泛型委托与Action泛型委托,这两种委托是内置的泛型委托的类型,可以直接使用。当然还内置了其他的泛型委托,但是这两种委托已经覆盖了所有的委托使用情况,其他的也就逐渐的废弃掉了。

Func委托

  1. // 这是内置的func委托。Func委托是有返回值的,默认最后一个参数是返回值。无论是func委托还是action委托的参数默认最多16个。
  2. Func<int, int> x = new Func<int, int>(Method4);

Action委托

  1. // 这是内置的action委托,action委托是有参数无返回值的。
  2. Action<int> A = new Action<int>(Method2);

调用委托方法与普通的委托方法是相同的。

多播委托

默认委托继承System.MulticastDelegate,也就是多播委托,所以委托默认是多播的。

  1. Action<int> A = new Action<int>(Method2);
  2. A += Method2;
  3. A += Method2;
  4. A -= Method2;

用+=或-=这两个符号可以制造方法链,委托执行的时候会按添加的次序一次执行链上的方法。当多播委托中的方法有返回值的时候,接收会使最后一个方法的返回值。

异步委托多线程

委托可以用BeginInvoke的方法来将方法用异步线程的方式启动。

具体的使用方法可以在多线程的章节查看。

Lambda表达式

lambda表达式本质上就是一个匿名方法,在C#3.0的时候出现的。最常用的就是配合委托使用。

  1. // 形如
  2. ()=>{
  3. }
  4. //这就是一个匿名方法。

注意:一lambda形式在多播委托中使用是移除不了的。

事件

  1. //事件
  2. event Action<int> Action = new Action<int>(Method2);

事件就是在委托的实例上加event关键字,

与多播委托的区别就是防止外部去invoke和赋值,子类也不可以。

事件是委托的进一步限制。

委托与事件的区别和联系:

事件是委托的实例,委托是一个类型,而事件是一个实例。