委托

1.委托是一个类
2.委托可以将方法作为参数传递给另一个方法
3.委托(delegate)是一种引用类型
4.建立委托(delegate),过程有点类似于建立一个函数指针。过程如下:

  1. 建立一个委托类型,并声明该委托可以指向的方法的签名(函数原型)

    delegate void MyDelegate(int a,int b);
  2.建立一个委托类的实例,并指向要调用的方法

    //利用委托类的构造方法指定,这是最为常见的一种方式

      MyDelegate md=new MyDelegate(Max);

      //利用自动推断方式来指明要调用的方法,该形式更类型于函数指针

      MyDelegate md=Max;

      int c=md(4,5);

5.在C#中,所有的委托都是从System.MulticastDelegate类派生的。

6.Ø 委托隐含具有sealed属性,即不能用来派生新的类型。

7.Ø 委托最大的作用就是为类的事件绑定事件处理程序。

8.Ø 在通过委托调用函数前,必须先检查委托是否为空(null),若非空,才能调用函数。

9.Ø 在委托实例中可以封装静态的方法也可以封装实例方法。

10Ø 在创建委托实例时,需要传递将要映射的方法或其他委托实例以指明委托将要封装的函数原型(.NET中称为方法签名:signature)。注意,如果映射的是静态方法,传递的参数应该是类名.方法名,如果映射的是实例方法,传递的参数应该是实例名.方法名。

11.Ø 只有当两个委托实例所映射的方法以及该方法所属的对象都相同时,才认为它们是想等的(从函数地址考虑)。

    3.利用委托类实例调用所指向的方法

      Invoke方法 们在调用委托,并执行该委托所指向的方法时,本质上就是调用了其Invoke方法。实际上,我们可以直接调用其Invoke方法,代码如下所示:

    int c = this.md.Invoke(a,b);

    另外,与Invoke方法对应的BeginInvoke,是对Invoke方法的一个异步调用,而EndInvoke是异步调用完成后的处理方法,关于异步调用的说明,我们将    在多线程的章节中进行说明。

   有的时候,我们想要调用一个委托,但同时可以执行多个方法(自定义事件中最为常见),比如,一个工作文档生成之后,系统要将生成文档日志,而且还要被  保存到数据库中,对于以上二个操作,如果只想调用一个委托,就可以顺序完成,那么使用多播委托,就可以实现。

多播委托(MulticastDelegate)提供了一种类似于流水线式的钩子机制,只要加载到这条流水线上的委托,都会被顺序执行。因为所有的委托都继承自MulticastDelegate,因此所的委托都具备多播特性。

下面能过一个控制台程序来说明多播委托(MulticastDelegate)的使用方式。


自定义事件,是委托的一个典型应用


this.button1.Click += new System.EventHandler(this.button1_Click);

“一个委托=这个委托本身+另外一个委托

我们讨论过MultiDelegate(多播委托),而事件本身也是委托,并且所有委托都是System.MultiDelegate类的派生类,在6.1.3中,我们曾经演示过,多个委托类型实例相加,就是将这些委托实例存放在一个多播委托的调用链中,当调用多播委托时,该多播委托的调用链中的所有委托都会顺序的被调用。

利用多播委托的原理,我们可以将多个方法注册给一个事件,如下所示:

this.button1.Click +=new System.EventHandler(this.button1_Click);

this.button1.Click +=new System.EventHandler(this.button1_Click1);

this.button1.Click +=new System.EventHandler(this.button1_Click2);

Button bt = sender as Button;

EventArgs类型是事件参数,当事件发生时,可以通过该参数来传递一些数据。当然EventArgs类本身是传递不了什么数据的,该类的类视图如下:

定义和使用委托分三个步骤:

1、委托声明。2、委托实例化。3、委托调用。

定义了委托之后,如何使用委托代表方法执行呢?首先要实例化委托。实例化委托就是将其指向某个方法,即调用委托的构造函数,并将相关联的方法作为参数传递。

原文地址:https://www.cnblogs.com/shuenjian901/p/3384897.html