C#中事件(event)
原创
©著作权归作者所有:来自51CTO博客作者TheOneGIS的原创作品,请联系作者获取转载授权,否则将追究法律责任
事件基于委托,为委托提供了一种发布/订阅机制。在Windows应用程序中Button类提供了Click事件。触发Click事件时调用的处理程序方法需要定义,其参数由委托类型定义。
MSDN中对事件(event)的解释如下:类或对象可以通过事件向其它类或对象通知发生的相关事情。发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”。
C#中使用事件需要如下步骤:
(1)创建一个委托
(2)将创建的委托与特定事件关联(.NET类库中的很多事情都是已经定制阿红的,所以它们也就有相应的一个委托,在编写关联事件处理程序的时候我们需要和这个委托有相同的签名)
(3)编写事件处理程序
(4)把这个委托实例添加到产生事件对象的事件列表中去(这个过程叫事件订阅)
下面来看一个处理输出字符的事件的实例:
保存事件信息的类
namespace ConsoleApplication.EventDemo
{
/*
* EventArgs是包含事件数据的类的基类,此类不包含事件数据,在事件引发时不向事件处理程序传递状态信息的事件会使用此类。
* 如果事件处理程序需要状态信息,则应用程序必须从此类派生一个类来保存数据。
*/
/// <summary>
/// 因为在我们键盘按键事件中要包含按键信息,所以要派生一个KeyEventArgs类,
/// 来保存按键信息,好让后面知道按了哪个键。
/// </summary>
class KeyEventArgs : EventArgs
{
private char keyChar;
public char KeyChar
{
get { return keyChar; }
}
public KeyEventArgs(char keyChar) : base()
{
this.keyChar = keyChar;
}
}
}
事件发行者
namespace ConsoleApplication.EventDemo
{
/// <summary>
/// 事件发生的类KeyInputMonitor,这个类用于监控键盘按键的输入并触发一个事件
/// </summary>
class KeyInputMonitor
{
//(1)创建一个委托,一般都是两个参数一个Object类型,一个继承与EventArgs的类型
public delegate void KeyDownHandler(Object sender, KeyEventArgs e);
//(2)将创建的委托和特定事件关联,在这里特定的事件为KeyDown
public event KeyDownHandler KeyDown;
public void Run()
{
char keyChar = (char)Console.Read();
KeyEventArgs KeyEventArgs = new KeyEventArgs(keyChar);
//触发事件,并将事件交由KeyDownHandler这个委托来处理
//参数this是指触发事件的对象就是本身这个对象,keyEventArgs包含了按键信息。
KeyDown(this, KeyEventArgs);
}
}
}
事件订户
namespace ConsoleApplication.EventDemo
{
/// <summary>
/// 事件接收方的类,这个类先产生一个委托实例,
/// 再把这个委托实例添加到产生事件对象的事件列表中去,这个过程又叫订阅事件。
/// 然后提供一个方法回显按键信息。
/// </summary>
class EventReceiver
{
//(3)编写事件处理程序
private void OnkeyDown(Object sender, KeyEventArgs e)
{
//真正的事件处理函数
Console.WriteLine("您输入的是:" + e.KeyChar);
}
//(4)利用编写的事件处理程序生成一个委托实例
//(5)把这个委托实例添加到产生事件对象的事件列表中去
public EventReceiver(KeyInputMonitor monitor)
{
//产生一个委托实例并添加到KeyInputMonitor产生的事件列表中
monitor.KeyDown += new KeyInputMonitor.KeyDownHandler(this.OnkeyDown);
}
}
}
如何调用
namespace ConsoleApplication.EventDemo
{
/// <summary>
/// 测试程序
/// </summary>
class EventDemo
{
public static void Main()
{
KeyInputMonitor monitor = new KeyInputMonitor();
EventReceiver receiver = new EventReceiver(monitor);
monitor.Run();
}
}
}
运行结果:
![C#中事件(event)_事件对象](https://s2.51cto.com/images/blog/202208/01124837_62e75b251b5393105.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)