委托事件

使用委托时要先实例化,和类一样,使用new关键字产生委托的新实例,然后将一个或者多个与委托签名匹配的方法与委托实例关联。随后调用委托时,就会调用所有与委托实例关联的方法。

与委托关联可以是任何类或者结构中的方法,可以是静态方法,只要是可以访问的方法都可以。创建一个委托类型使用关键字delegate(委托)

将方法作为参数传递

委托可以让方法作为参数传递给其它方法

 事件自身就是委托类型,由于委托可以绑定和调用多个方法,所以会为事件的处理带来方便。类型只需要对外公开事件,就可以与外部的其它地方关联,从而实现事件订阅

要在类中声明事件,首先要定义用来作为事件封装类型的委托,用event关键字来声明事件。为了允许派生类重写引发事件的代码,通常会在类中声明一个受保护的方法,习惯上

命名On<事件名>

protected virtual    表示受保护的,virtual 关键字用于修改方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。

由于不同的事件要传递的参数不同,更多时候是从EventArgs类派生的子类的实例,显然EventHandler委托时不能满足各种情况的。

如果针对不同的事件也定义一个对应的委托,数量一旦多起来,不好管理,为了解决这个问题,.NET类库提供了一个带有泛型参数的事件

处理委托。

public delegate void EventHandler<TEventArgs>(object sender,TEventArgs e);   TEventArgs 是一个泛型参数

 多播委托:

每个委托都只包含一个方法调用,调用委托的次数和调用方法的次数相同。如果需要调用委托的一次可以执行多个方法,我们需要多播委托

多播委托就是一个包含多个方法的委托就叫多播委托

委托的概念:

定义:委托(Delegate)是一个类,它定义了方法的类型。实现了将一个方法当作另一个方法的参数来传递。

声明:public delegate 返回值 委托名称(参数)

实例化委托:

MyDelegate myDelegate= new MyDelegate (WriteToFile)

MyDelegate myDelegate=WriteToFile

委托变量在使用时,跟方法的调用在形式上是一样的。

例如: int num = myDelegate();

//定义委托

delegate int MyDelegate(string str);

//将方法传递给委托

MyDelegate myDelegate = new MyDelegate(GetLength);

//执行委托

int result = myDelegate("my name is zhangdonglei");

委托的一个有趣且有用的属性是,他不知道也不关心所引用的方法和类;只关心引用的方法是否具有与委托相同的参数和返回值。

多播委托:

每个委托都只包含一个方法调用,调用委托的次数和调用方法的次数相同。如果需要调用委托的一次可以执行多个方法,这时我们就需要多播委托。

通俗来讲,多播委托就是一个包含多个方法的委托称为多播委托

 委托链

委托链就是链接多个委托的委托

 什么是事件

事件(Event)基本上说是一个用户操作,如按键,点击,/鼠标移动等等,或者是一些出现,如系统胜澈的通知。应用程序需要在事件发生时响应事件

事件在类中声明且生成,且通过使用同一个类或其他类的委托与事件处理程序关联。包含事件的类用于发布事件。这被称为发布器(publisher)类。其他接受该事件的类被称为订阅器(subscriber)类。事件使用发布—订阅(publisher—subscriber)模型。

发布器(publisher)是一个包含事件和委托定义对象。事件和委托之间的联系也定义在这对象中。发布器(subscriber)是一个接受事件并提供事件处理程序的对象。发布器(publisher)类中的委托调用订阅器(subscriber)类中的方法(事件处理程序)。

事件的声明:

在类的内部声明事件,首先必须声明该事件的委托类型。

  public delegate void BoilerLogHanddler(string status);

然后,使用event关键字,声明事件本身:

  public event BoilerLogHandler BoilerEventLog;

事件的订阅

BoilerEventLog+=BoilerLogHandler(show);

BolierEventLog+show;

原文地址:https://www.cnblogs.com/zhangdonglei/p/11166194.html