开发基于对象的应用程序,有时候需要使用一种对象通信方式,在一个对象中发生了一些事情时,就需要通知其他对象。这里用到了事件。
委托就用做应用程序接受到消息时封装事件的方式。
一、接收器、发送器
事件接收器是指在发生某些事情时被通知的任何应用程序或对象
事件发送器可以是是应用程序中的另一个对象或程序集,作用是引发事件,如:点击按钮,发送器就是.NET运行库。需要注意的是,事件发送器并不知道接收器是谁,这就使得事件非常有用。
现在,在事件接收器的某个地方有一个方法,他负责处理事件。在每次发生已注册的事件时,就执行这个方法。由于发送器不知道接收器是谁,所以无法设置两者之间的引用类型,这时就需要委托作为中介了。
发送器定义接收器要使用的委托,接收器把事件处理方法注册到事件中。链接事件处理方法的过程称为封装事件。
下面来看一个例子,创建一个winform程序,从工具箱拖入一个Button并取名为evenTest,定义一个负责处理事件的方法:click_test()
public partial class Form1 : Form { public Form1() { InitializeComponent(); eventTest.Click += click_test;
//this.eventTest.Click += new System.EventHandler(this.click_test); } private void click_test(object sender, EventArgs e) { MessageBox.Show(@"我是事件处理程序!"); } }
在构造函数中的初始化方法后面加上委托相关代码 eventTest.Click += click_test;
表示把处理程序click_test()赋予Click事件的委托
这将告诉运行库,在引发evenTest按钮的Click事件时,执行click_test方法,其实这个代码可以自动生产,只需要在设计面板双击按钮,ms会自动生产click方法和委托代码,在Designer.cs文件中的InitializeComponent()方法中可以找到
this.eventTest.Click += new System.EventHandler(this.eventTest_Click);
//缩写为:evenTest.Click += eventTest_Click;
前面的代码中是笔者自己定义的方法名,并不规范,事件方法命名应按照约定遵循“object_event”,object是引发事件的对象,event就是被引发的事件,为了代码的可读性,笔者觉得还是应该遵循这一规则。
注意:
1、处理事件的方法必须是void,不能有返回值;
2、只要是使用EventHandler委托,参数就应该是objec和EventArgs,第一个参数是引发事件的对象,第二个参数EventArgs是包含有关事件的其他有用信息的对象。这个参数可以是任何类型,只要它派生自EventArgs即可。
后一篇:自己定义EventArgs,还原事件实现真相