如题,一下关于委托和事件的几点总结如有错误,还请各位朋友指正,谢谢。
1.委托是事件的基础。
2.委托类似于C、C++的函数指针,它能够引用函数,在C#中委托是一个对象,并且是类型安全的。
3.一个委托类型变量可以引用一个或多个方法,这些方法由委托存放在“调用列表”。
4.委托引用的方法,其签名一般要求要和委托定义相一致(返回值类型,参数个数,参数类型),但不是必须。
5.委托的定义和方法定义类似,但委托是引用类型,不是方法。
6.委托声明和实例化
格式: 访问修饰符 delegate 返回值 方法名(参数列表)
7.实例化委托的方法:
(1)使用构造函数实例化,构造函数接受一个目标方法的签名
(2)直接将目标方法的签名=赋值给委托变量
8.委托不但可以引用实例方法,还可以引用静态方法。
9.使用“+”可以将两个委托组合起来,使用“-”可以从一个组合委托删除一个成员
使用“+=”实现一个委托引用多个方法,使用“-=”实现从一个委托删除一个对方法的引用
10.匿名方法:本质上是传递给委托的代码块。这是使用委托的另一种方式。
事件
1.事件涉及两类角色:事件发布者和事件订阅者
触发事件的对象称为事件发布者,捕获事件并对其做出响应的对象叫做事件订阅者。
2.事件触发后,事件发布者要发布消息,
通知事件订阅者进行事件处理,但是事件发布者并不知道哪些事件订阅者,
这就需要在发布者和订阅者之间存在一个中介,这个中介就是委托。
3.声明事件的语法和定义一个类的成员非常相似,其实事件就是类成员一种。
事件格式: 访问修饰符号 event 委托类型 事件名;
[委托类型]既可以使用预定义的委托类型EventHandler(推荐使用这种),
【EventHandler作为系统预定义委托类型,委托签名如下:
public deleaget void EventHandler(Object sender, EventAgrs e);】
也可以使用自定义的委托类型。
4.订阅事件:
本质上讲事件是委托类型,因此事件处理方法必须和委托签名相匹配;
使用“+=”来订阅事件即可。
事件发布者.事件名 += 事件处理方法
还可以通过匿名方法和lambda表达式来订阅事件。
事件发布者.事件名 += delegate(object sender, EventArgs e)
{
//....
}
//lambda表达式来订阅事件
事件发布者.事件名 += (object sender, EventArgs e) =>
{
//....
}
取消事件和订阅事件相反。通过“-=”实现。
触发事件:
if(事件名 != null) //判断事件是否绑定了事件处理方法
{
事件名(this,new EventAgrs());//像调用方法一样触发事件
}
5.如果想要在事件引发时向事件处理方法传递状态信息(数据),则可以从EventAgrs类派生出一个类来保持信息。