using System;
namespace EventExample
{
public delegate void MyEventHandler(Object sender, EventArgs e);
public class EventExample
{
public event MyEventHandler FindSeven;
private Random _NumberCreator = new Random();
public void MessageLoop()
{
while(true)
{
历此 if(_NumberCreator.Next(8) == 7)
{
if(FindSeven != null)
{
烂烂没 EventArgs e = new EventArgs();
FindSeven(this, e);
}
break;
}
}
}
}
class Program
{
static void Main(string[] args)
{
EventExample myEventControl = new EventExample();
myEventControl.FindSeven += new MyEventHandler(MyFindSeven);
myEventControl.MessageLoop();
}
public static void MyFindSeven(Object sender, EventArgs e)
{
Console.WriteLine("Find Seven");
}
}
}
上面是一段简单的自定义事件处理代码
首先解释一下委托。委托相当于c语言中的函数指针,用来引用参数相饥纳同但处理不同的函数,可以看作是 签名相同的函数 的共同别名。在事件处理中,它用来回调自定义的事件处理函数。上面的MyEventHandler委托可以用来代替所有参数为:第一个是Object类型、第二个为EventArgs类型,返回值为void的函数,例如Program类中的MyFindSeven函数。委托是一种类型结构,与类、结构体、枚举一样,因此它可以直接在命名空间中声明,不必放在某个类中。delegate 关键字相当于class关键字,MyEventHandler相当于EventExample。实例化委托时,可以以函数作为参数。例如MyEventHandler handler = new MyEventHandler(MyFindSeven)实例化了MyEventHandler委托。此后handler就可以代替MyFindSeven函数。调用函数时,handler(this,e)与MyFindSeven(this,e)等同。
事件的设计主要包括:定义事件、编写事件处理代码、绑定处理函数等步骤。
定义事件时,事件必须以成员的身份出现。定义事件使用event关键字,后面跟处理事件的委托类型(MyEventHandler),使用委托是语法规定,可以查看C#语法规范Ecma334中关于事件声明的描述。为了使事件的触发处理尽量简单,我将事件的触发和接收处理都放在了EventExample类中。类成员FindSeven表明EventExample类可以接收事件,成员函数MessageLoop用于触发FindSeven事件,当随机数为7时,触发事件。判断FindSeven是否为空是为了检查事件是否已经绑定自定义处理代码。
主函数中,首先实例化事件引发和接收事件的类EventExample,接着为FindSeven绑定处理函数,最后调用MessageLoop触发事件。
在事件中使用委托的好处在于,当事件触发时,底层代码可以直接调用委托,不用关心事件处理的自定义函数。EventExample相当于button一类的控件,事件触发时,.NET底层代码直接调用Click一类的委托,只要编程人员通过…Click += new EventHandler(事件处理函数)这种方式将自定义处理函数绑定到事件上,就可以保证编写的代码会参与到事件的处理中。
关于C#中事件的详细描述,可以查看《C#入门经典》、《C#高级编程》、《CLR via C#》这些书籍。
事件就是一个委托,
这个有点多,那天有空发