使用委托时要先实例化,和类一样,使用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;