摘自 http://www.cnblogs.com/michaelxu/archive/2008/04/02/1134217.html
实际项目中也写的有事件,但是不是特别理解,还是先放代码:
internal class KeyEventArgs : EventArgs { private char keyChar; public KeyEventArgs(char keyChar) { this.keyChar = keyChar; } public char KeyChar { get { return keyChar; } } } internal class KeyInputMonitor { // 创建一个委托,返回类型为void,两个参数 public delegate void KeyDownHandler(object sender, KeyEventArgs e); // 将创建的委托和特定事件关联,在这里特定的事件为KeyDown 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); } } internal class EventReceiver { public EventReceiver( KeyInputMonitor monitor ) { // 产生一个委托实例并添加到KeyInputMonitor产生的事件列表中 monitor.KeyDown += new KeyInputMonitor.KeyDownHandler( this.OnKeyDown ); } private void OnKeyDown(object sender, KeyEventArgs e) { // 真正的事件处理函数 Console.WriteLine( "Capture key: {0}", e.KeyChar ); } } class Program { static void Main(string[] args) { // 实例化一个事件发送器 KeyInputMonitor monitor = new KeyInputMonitor(); // 实例化一个事件接收器 EventReceiver eventReceiver = new EventReceiver(monitor); // 运行 monitor.Run(); } }
C#中使用事件需要的步骤:
1.创建一个委托
2.将创建的委托与特定事件关联(.Net类库中的很多事件都是已经定制好的,所以他们也就有相应的一个委托,在编写关联事件处理程序--也就是当有事件发生时我们要执行的方法的时候我们需要和这个委托有相同的签名)
3.编写事件处理程序
4.利用编写的事件处理程序生成一个委托实例
5.把这个委托实例添加到产生事件对象的事件列表中去,这个过程又叫订阅事件
C#中事件产生和实现的流程:
1.定义A为产生事件的实例,a为A产生的一个事件
2.定义B为接收事件的实例,b为处理事件的方法
3.A由于用户(程序编写者或程序使用者)或者系统产生一个a事件(例如点击一个Button,产生一个Click事件)
4.A通过事件列表中的委托对象将这个事件通知给B
5.B接到一个事件通知(实际是B.b利用委托来实现事件的接收)
6.调用B.b方法完成事件处理
public class A
{
public delegate void EventHandler(object sender);
public event EventHandler a;
public void Run()
{
Console.WriteLine("Trigger an event.");
a(this);
}
}
class B
{
public B(A a)
{
a.a += new A.EventHandler(this.b);
}
private void b(object sender)
{
Console.WriteLine("Received and handled an event." );
Console.Read();
}
}