本篇文章将简要介绍事件编程的相关基本知识。在开发程序时,事件对我们而言是经常接触的一个概念,比如鼠标事件、键盘事件等等。在这里要介绍的不仅仅是局限于一些系统定义的事件,更应该关注利用事件返回一些自定义数据。
在MSDN中对事件的定义是这样的:事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互(例如鼠标单击)引起的,也可能是由某些其他的程序逻辑触发的。引发事件的对象称为事件发送方。捕获事件并对其作出响应的对象叫做事件接收方。
显然,很多时候,我们需要事件生成事件数据,这时候就需要涉及到自定义事件委托的概念了。而委托其实就是一种类型安全的函数回调机制,这就是通常我们在阅读相关.NET文档时所看到的将方法作为方法的参数。委托从本质上来说是一个类,是可以保存对方法的引用的类。
要使用委托,只需声明委托、对委托进行实例化、调用委托三个基本步骤即可。使用delegate关键字即可对委托进行声明,如public delegate void SayHelloDelegate(string name);对委托的实例化就是将要调用的方法作为参数将委托于方法关联起来。对委托的使用实例可以参考MSDN(ms-help://MS.MSDNQTR.v90.chs/fxref_mscorlib/html/5b58d80d-83a1-d73a-98a1-09c51326d968.htm),这里不做详述。
在事件通信中,事件发送方类不知道哪个对象或方法将接收到(处理)它引发的事件。所需要的是在源和接收方之间存在一个媒介(或类似指针的机制)。这个媒介就是在前面提到的委托类型。其实,可以这么说,事件就是一个特殊的委托。
是事件的使用通常有两种情况,一个是不生成事件数据的事件,这个只需要使用System.EventHandler便可以了,例程如下:
另外一种就是需要事件数据的事件了,笔者比较倾向于使用泛型来处理这一类的数据,例程如下(新增了一个继承自EventArgs类的THelloEventArgs类):
关于事件与委托的更高级用法还有待在开发过程中不断学习研究,并深刻理解体会。不过,采用上面所提到的事件编程已经可以基本满足SharpStreaming项目的开发了。若想要对委托与事件进行更深入的了解,不妨可以阅读这篇经典文章:C#中的委托和事件(http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx),相信定会受益匪浅。