C# 自定义事件
2015-12-23 00:23
417 查看
本身今天晚上是要写一篇关于自定义事件的博客,然后自己再撸会代码。可是计划不如变化,今天听到同事谈到陈冠希拍纪录片,所以就去优酷上看了一下,连着看完了,要知道我这人有点强迫症,要搞一件事情一定要搞完的,所以现在已经快11点了,记录完这个就去睡觉了。
关于C#自定义事件,通俗的讲,它就是一个特殊的委托。可以这么想,我们将一件事交给委托人,我们不希望它什么时候都可以做这件事,而是希望他们在特定的情况下做这件事,那么这个特定的情况就是事件发生的前提,这个事件一旦发生,委托上绑定的方法就会发生。所以说事件是被限制的委托,它本身就是一个对象(可以理解为类中的一个字段),它不能在类外像方法一样被调用,只能对其做+=或-=的注册和取消事件操作。而委托是一种类型,所以它可以在类外被声明和初始化(即做=操作)
自定义事件
这里模拟一个keydown事件,即监听键盘按下的事件来理解如何自定义事件。
上面说了事件是一个对象,可以理解为一个字段,那么它就要被封装在一个类中,这个类便是事件源类(即事件发生的地点),这里便于理解,我们将这个类定义为Keyboard(键盘)类。
如上所示,我们定义了一个处理键盘被按下的委托KeyBoardDown,因为键盘被按下是一个发生的动作,所以为了知道这个动作什么时候发生我们再执行委托的方法,所以我们定义了一个事件对象KeyDown,当键盘被按下发生的时候去执行注册在事件KeyDown对象上的事件方法。而OnKeyDown方法就是用来监视键盘被按下,即触发事件的方法。这里的UserEventArgs 就是模拟的键盘上的键类,它里面有key属性:
它就是用来存储触发事件的一些具体细节,例如当我们按钮被click的时候用的是鼠标左键触发,还是右键等等。即存储触发者的一些信息。这里的触发者是键盘上的键,所以这个类就有了key属性。
测试自定义事件
既然已经有了事件,我们就可以像使用button按钮注册事件那样,来对自己的自定义事件进行注册了:
注册了事件,我们就要写关于这个事件的方法了:
这样是不是很像我们平常使用button按钮的事件一样。
测试结果:
总结
这个自定义事件的编写对以后的开发很有帮助,事件是一个对象,一个特殊的委托对象,他的特殊在于在类外你必须注册使用,而不能直接调用,这与一般的委托对象不同,因为注册给它的方法是在特定情况下才能够被执行的,如果可以调用,那就相当于直接执行了注册方法,这样就失去了事件的意义了。而委托是一种类型,能够执行指定方法的类型。理解这一点是最重要的
关于C#自定义事件,通俗的讲,它就是一个特殊的委托。可以这么想,我们将一件事交给委托人,我们不希望它什么时候都可以做这件事,而是希望他们在特定的情况下做这件事,那么这个特定的情况就是事件发生的前提,这个事件一旦发生,委托上绑定的方法就会发生。所以说事件是被限制的委托,它本身就是一个对象(可以理解为类中的一个字段),它不能在类外像方法一样被调用,只能对其做+=或-=的注册和取消事件操作。而委托是一种类型,所以它可以在类外被声明和初始化(即做=操作)
自定义事件
这里模拟一个keydown事件,即监听键盘按下的事件来理解如何自定义事件。
上面说了事件是一个对象,可以理解为一个字段,那么它就要被封装在一个类中,这个类便是事件源类(即事件发生的地点),这里便于理解,我们将这个类定义为Keyboard(键盘)类。
class Keyboard { //定义一个委托 public delegate void KeyBoardDown(object sender, UserEventArgs e); //定义一个事件 public event KeyBoardDown KeyDown; //触发事件的方法 public virtual void OnKeyDown() { UserEventArgs e; while (true) { ConsoleKeyInfo inputStr = Console.ReadKey(); if (inputStr.KeyChar != ' ') { e = new UserEventArgs(inputStr.KeyChar); KeyDown(this, e); } } } }
如上所示,我们定义了一个处理键盘被按下的委托KeyBoardDown,因为键盘被按下是一个发生的动作,所以为了知道这个动作什么时候发生我们再执行委托的方法,所以我们定义了一个事件对象KeyDown,当键盘被按下发生的时候去执行注册在事件KeyDown对象上的事件方法。而OnKeyDown方法就是用来监视键盘被按下,即触发事件的方法。这里的UserEventArgs 就是模拟的键盘上的键类,它里面有key属性:
public class UserEventArgs { public char key; public UserEventArgs(char presskey) { this.key = presskey; } }
它就是用来存储触发事件的一些具体细节,例如当我们按钮被click的时候用的是鼠标左键触发,还是右键等等。即存储触发者的一些信息。这里的触发者是键盘上的键,所以这个类就有了key属性。
测试自定义事件
既然已经有了事件,我们就可以像使用button按钮注册事件那样,来对自己的自定义事件进行注册了:
static void Main(string[] args) { //定义键盘对象 Keyboard testKeyDownEvent = new Keyboard(); Console.Write("please input a value:"); //注册键盘被按下事件 testKeyDownEvent.KeyDown += testEvent_KeyDown; testKeyDownEvent.KeyDown += test1Event_KeyDown; //监视键盘被按下 testKeyDownEvent.OnKeyDown(); }
注册了事件,我们就要写关于这个事件的方法了:
static void test1Event_KeyDown(object sender, UserEventArgs e) { Console.Write("please input a value:"); } static void testEvent_KeyDown(object sender, UserEventArgs e) { Console.WriteLine("\r\nyour input is: {0}", e.key); }
这样是不是很像我们平常使用button按钮的事件一样。
测试结果:
总结
这个自定义事件的编写对以后的开发很有帮助,事件是一个对象,一个特殊的委托对象,他的特殊在于在类外你必须注册使用,而不能直接调用,这与一般的委托对象不同,因为注册给它的方法是在特定情况下才能够被执行的,如果可以调用,那就相当于直接执行了注册方法,这样就失去了事件的意义了。而委托是一种类型,能够执行指定方法的类型。理解这一点是最重要的
相关文章推荐
- 一个打印日志类
- C#_IEnumerable和IEnumerable<T>
- C#中的委托和事件(续)
- C# 中的委托和事件
- C#_LINQ数据查询
- 分分搞懂c#中的委托
- C#下用Emgucv对图片进行灰度化、二值化、边缘检测、膨胀腐蚀运算、霍夫变换进行表格识别
- 造轮子_C#中yield return用法分析
- C# string.split 分割字符串
- C# 多线程的自动管理(线程池)
- C#生成缩略图,指定像素大小
- GPS定位代码C# VS2005 Sample Code
- C#泛型
- c#面向对象基础 静态成员、构造函数、命名空间与类库
- C# 强制关闭当前程序进程(完全Kill掉不留痕迹)
- 分分钟用上C#中的委托和事件之窗体篇
- C# 打印PDF文件之使用不同打印机打印所有页面或部分页面
- C#中控制设计模式下返回
- C# 打印PDF文件之使用不同打印机打印所有页面或部分页面
- Web Service开发