事件是由对象引发的,处理事件必须订阅它们(订阅事件就是指提供代码,在事件发生时执行这些代码——事件处理程序)。
一个事件可供多个处理程序订阅:一个事件发生时,多个事件处理 程序都会被调用。
事件的定义:
定义事件前,先要定义一个委托类型用于该事件,这个委托类型指定了事件处理方法的参数和返回类型。如:
public delegate void MessageHandler(string messageText);
定义事件:使用event关键字,并指定事件的委托类型,如:public event MessageHandler MessageArrived;
引发事件:MessageArrived("This is a message.");
example:
定义一个保存数据的类
namespace delegateClass
{
//EventArgs类:包含事件数据的类的基类,在事件引发时不向事件处理程序传递状态信息的事件会使用此类,
//应用程序从此类派生一个类保存数据
internal class KeyEventArgs:EventArgs
{
private char keyChar;
public KeyEventArgs(char keyChar) : base()
{
this.keyChar = keyChar;
}
public char KeyChar { get { return keyChar; } }
}
}
定义一个触发事件的类
/*
* 监控键盘按键的输入并触发一个事件
*/
namespace delegateClass
{
internal class KeyInputMonitor
{
public delegate void KeyDownHandler(object sender, KeyEventArgs e);
public event KeyDownHandler KeyDown;
public void Run()
{
bool finished = false;
do
{
Console.WriteLine("Input a char:");
string response = Console.ReadLine();
char responseChar = (response == "") ? ' ' : char.ToUpper(response[0]);
switch (responseChar)
{
case 'X':
finished = true;
break;
default:
KeyEventArgs keyEventArgs = new KeyEventArgs(responseChar);
KeyDown(this, keyEventArgs);
break;
}
} while (!finished);
}
}
}
定义一个处理事件的类
/// <summary>
/// 产生一个委托实例,把这个委托实例添加到产生事件对象的事件列表中去(订阅事件)
/// </summary>
namespace delegateClass
{
internal class EventReceiver
{
public EventReceiver(KeyInputMonitor monitor)
{
monitor.KeyDown += OnKeyDown;
}
public void OnKeyDown(object sender, KeyEventArgs e)
{
Console.WriteLine("Capture key: {0}", e.KeyChar);
}
}
}
主函数用于调用
class MainEntryPoint
{
static void Main(string[] args)
{
KeyInputMonitor monitor = new KeyInputMonitor();
EventReceiver eventReceiver = new EventReceiver(monitor);
monitor.Run();
}
}