首页 > 代码库 > 委托与事件
委托与事件
前面已经具体说明了委托,这里重点解析事件。(关于委托和Lambda:委托与Lambda表达式)
一.委托与事件的关系:
- 委托可以理解为指向一个方法的数据类型
- 由于委托外界只需要通过一个委托变量接收委托,就可以随意的调用了。非常不安全,事件对委托做了封装。使得外界不能随便调用
- 事件内部是通过委托来实现的
- 为了方便操作委托,体统提供了三种泛型委托:
- Action //无返回值泛型委托
- Func //有返回值泛型委托,最后一位为:返回值
- predicate //返回值为bool的泛型委托
- 匿名方法:
- Predicate<string> p = delegate(string str) { return true; };
- 事件处理:
- 事件是基于EventHandle和EventArgs基类的
- 第一个参数 sender,其中object类型的参数 sender表示的是发送消息的对象,为什么要使用object类型呢,这是因为不同类型的对象调用时使用object能很好的兼容
- 第二个参数 e,他的类型为EventArgs.EventArgs这个类没有实际的用途,只是作为一个基类让其他对象继承。很多对象不需要传递额外的信息,例如按钮事件,只是调用一个回调方法就够了。当我们定义的事件不需要传递额外的信息时,这时调用EventArgs.Empty就行了,不需要重新构建一个EventArgs对象
- 第一个参数 sender,其中object类型的参数 sender表示的是发送消息的对象,为什么要使用object类型呢,这是因为不同类型的对象调用时使用object能很好的兼容
- 事件是基于EventHandle和EventArgs基类的
二.事件的定义:
事件(event)的声明的语法如下:
public event 委托类型 事件名;
例子:
//定义一个委托 public delegate void delegateRun(); //定义一个事件 public event delegateRun eventRun;
事件的使用方法:
class Program{ static void Main(string[] args) { EvtHandler evt = new EvtHandler(); evt.evtAct += evt_evtAct; evt.evtHandler += evt_evtHandler; evt.handler(); Console.ReadKey(); } static void evt_evtHandler(object sender, EventArgs e) { Console.WriteLine("事件处理者"); } static void evt_evtAct() { Console.WriteLine( "委托事件"); }}public class EvtHandler{ public event EventHandler evtHandler; public event Action evtAct; public void handler() { evtHandler(null,null); evtAct(); }}
三.使用事件需要的步骤:
- 创建委托
- 将创建的委托与特定事件关联(事件发生时,我们要执行的方法的时候,我们需要和这个委托有相同的签名)
- 编写事件处理程序
- 利用编写的C#事件处理程序生成一个委托实例
- 把这个委托实例添加到产生事件对象的事件列表中去,这个过程又叫订阅事件
四.订阅事件:
定义好事件后,与事件有关的人会订阅事件,只有订阅事件的对象才会收到发生事件的通知,没有订阅该事件的对象则不会收到通知。
订阅事件的语法如下:
事件名+=new 委托名(方法名);
五.引发事件:
public event MyDel eventRun;
public
void
Begin()
{
eventRun();
}
委托与事件
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。