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]);
}
}
}
程序执行结果
订阅事件
输入一个字符,再按enter键
aaaa
发送者:事件.TestEventSource,所按得健为:a
取消订阅事件
输入一个字符,再按enter健
TestEventSource类。他就相当于windows控件类一样,是事件的源,里面包含有事件的声明,以及存储调用参数的事件参数类,以及事件的触发方法。
TestEventListener类。他提供了事件处理程序,并实现了事件处理程序和事件对象的邦定,当然时间处理程序可以放在别处,跟邦定程序(订阅事件)放在一起便于理解和调用
Test类,实例化自定义事件的事件源对象,并调用TestEventListener类中的Subscribe(es);方法进行事件对象和事件处理程序的邦定(订阅事件),调用TestEventSource类中的RaiseEvent(charkeyToRaiseEvent)引发对象,并有对象所指定的委托回调处理事件。完成整个自定义事件。
其中 RaiseEvent(charkeyToRaiseEvent) 就相当于main()一样是自定义事件的执行入口, 从这个法开始---〉调用事件委托----〉查找订阅事件程序找到事件所封装的方法集----〉由委托回调事件处理程序并传递参数---〉执行事件处理程序。
相关文章
- C#并发实战Parallel.ForEach使用
- C#与.NET的区别和C#程序结构
- C#实现登录界面,密码星号显示(隐藏输入密码)
- C# 使用原生 System.IO.Compression 实现 zip 的压缩与解压
- 【地铁上的Redis与C#】数据类型(一):为什么常用的数据类型是五种
- C# winform 窗体缩放失真
- C#编写方法实例
- C#Winform调用系统接口操作INI配置文件的代码
- C#生成不重复随机数列表实例
- C#数据结构之循环链表的实例代码
- C#4.0大数的运算--BigInteger的应用详解
- C#控件命名规范汇总(超详细)
- C#无边框窗体之窗体移动实现代码
- C#中跨线程访问控件问题解决方案分享
- C#实现json的序列化和反序列化实例代码
- c#在windows服务中使用定时器实例代码
- C#中使用HttpDownLoadHelper下载文件实例
- C#的内存回收代码
- asp.net中c#自定义事件的实现方法详解
- C#枚举类型与结构类型实例解析
- C#执行SQL事务用法实例
- C#实现排列组合算法完整实例
- C#利用GDI+绘制旋转文字等效果实例