您的位置:首页 > 编程语言 > C#

C# 自定义事件

2015-12-23 00:23 417 查看
本身今天晚上是要写一篇关于自定义事件的博客,然后自己再撸会代码。可是计划不如变化,今天听到同事谈到陈冠希拍纪录片,所以就去优酷上看了一下,连着看完了,要知道我这人有点强迫症,要搞一件事情一定要搞完的,所以现在已经快11点了,记录完这个就去睡觉了。

关于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按钮的事件一样。

测试结果:



总结

这个自定义事件的编写对以后的开发很有帮助,事件是一个对象,一个特殊的委托对象,他的特殊在于在类外你必须注册使用,而不能直接调用,这与一般的委托对象不同,因为注册给它的方法是在特定情况下才能够被执行的,如果可以调用,那就相当于直接执行了注册方法,这样就失去了事件的意义了。而委托是一种类型,能够执行指定方法的类型。理解这一点是最重要的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: