C#中自定义事件和委托实例
在windows编程中用到最多的就是控件的事件了,微软给我们很好的方式,把注意力放到事件执行方法的设计和编码上,但是但我们真正弄懂了事件的真正出发执行原理的话,对我们的编程的提高真是非常榜的,例如在windows编程中如果我单击了一个button按钮触发了button的click事件 Button1_Click(){},但是有时候我们编程的时候,不但想要触发button的单击事件,我还想要把其他的时间也要调用下来顺序执行,要实现这种方式,除了在方法最后对其他方法的调用,还可以利用将其他需要顺序执行的方法封装到button的click事件的委托对象中,这样就能够顺序执行毁掉方法列表中的程序了,而这种方式的实现是以清楚事件触发和委托的调用为前提的。
事件是类和对象向外界发出的消息,事件的执行是通过事件委托的方式,调用我们所准备好的处理方法,而是先消息的响应的。要响应某些事件并针对某些事件执行我们意定的方法,需要做到以下几步:
1、声明事件委托。
2、声明事件。
3、添加事件的触发方法。
4、添加事件的处理程序(响应事件的方法)。
5、将指定的事件处理程序邦定到要处理的事件上(订阅事件)。
6、用户信息操作,并触发事件(调用事件的触发方法)。
7、通过事件委托的回调,执行我们需要的事件处理程序。
下面我们举一个简单的自定义事件处理程序的例子(控制台程序)
namespace事件 { //发布事件的类 publicclassTestEventSource { //定义事件参数类 publicclassTestEventArgs:EventArgs { publicreadonlycharKeyToRaiseEvent; publicTestEventArgs(charkeyToRaiseEvent) { KeyToRaiseEvent=keyToRaiseEvent; } }
//定义delegate publicdelegatevoidTestEventHandler(objectsender,TestEventArgse); //用event关键字声明事件对象 publiceventTestEventHandlerTestEvent;
//事件触发方法 protectedvirtualvoidOnTestEvent(TestEventArgse) { if(TestEvent!=null) TestEvent(this,e); }
//引发事件 publicvoidRaiseEvent(charkeyToRaiseEvent) { TestEventArgse=newTestEventArgs(keyToRaiseEvent); OnTestEvent(e); }
} //监听事件的类 publicclassTestEventListener { //定义处理事件的方法,他与声明事件的delegate具有相同的参数和返回值类型 publicvoidKeyPressed(objectsender,TestEventSource.TestEventArgse) { Console.WriteLine("发送者:{0},所按得健为:{1}",sender,e.KeyToRaiseEvent); }
//订阅事件 publicvoidSubscribe(TestEventSourceevenSource) { evenSource.TestEvent+=newTestEventSource.TestEventHandler(KeyPressed); } //取消订阅事件 publicvoidUnSubscribe(TestEventSourceevenSource) { evenSource.TestEvent-=newTestEventSource.TestEventHandler(KeyPressed); } }
//测试类 publicclassTest { publicstaticvoidMain() { //创建事件源对象 TestEventSourcees=newTestEventSource(); //创建监听对象 TestEventListenerel=newTestEventListener(); //订阅事件 Console.WriteLine("订阅事件\n"); el.Subscribe(es); //引发事件 Console.WriteLine("输入一个字符,再按enter键"); strings=Console.ReadLine(); es.RaiseEvent(s.ToCharArray()[0]); //取消订阅事件 Console.WriteLine("\n取消订阅事件\n"); el.UnSubscribe(es);
//引发事件 Console.WriteLine("输入一个字符,再按enter健"); s=Console.ReadLine(); es.RaiseEvent(s.ToCharArray()[0]);
} }
}