C#中事件(event)

事件基于委托,为委托提供了一种发布/订阅机制。在Windows应用程序中Button类提供了Click事件。触发Click事件时调用的处理程序方法需要定义,其参数由委托类型定义。

MSDN中对事件(event)的解释如下:类或对象可以通过事件向其它类或对象通知发生的相关事情。发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”。

C#中使用事件需要如下步骤:

(1)创建一个委托

(2)将创建的委托与特定事件关联(.NET类库中的很多事情都是已经定制阿红的,所以它们也就有相应的一个委托,在编写关联事件处理程序的时候我们需要和这个委托有相同的签名)

(3)编写事件处理程序

(4)把这个委托实例添加到产生事件对象的事件列表中去(这个过程叫事件订阅)

下面来看一个处理输出字符的事件的实例:

保存事件信息的类

namespace ConsoleApplication.EventDemo
{
    /*
     * EventArgs是包含事件数据的类的基类,此类不包含事件数据,在事件引发时不向事件处理程序传递状态信息的事件会使用此类。
     * 如果事件处理程序需要状态信息,则应用程序必须从此类派生一个类来保存数据。
    */
    /// 
    /// 因为在我们键盘按键事件中要包含按键信息,所以要派生一个KeyEventArgs类,
    /// 来保存按键信息,好让后面知道按了哪个键。
    /// 
    class KeyEventArgs : EventArgs
    {
        private char keyChar;
        public char KeyChar
        {
            get { return keyChar; }
        }
        public KeyEventArgs(char keyChar) : base()
        {
            this.keyChar = keyChar;
        }
    }
}
事件发行者

namespace ConsoleApplication.EventDemo
{
    /// 
    /// 事件发生的类KeyInputMonitor,这个类用于监控键盘按键的输入并触发一个事件
    /// 
    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
{
    /// 
    /// 事件接收方的类,这个类先产生一个委托实例,
    /// 再把这个委托实例添加到产生事件对象的事件列表中去,这个过程又叫订阅事件。
    /// 然后提供一个方法回显按键信息。
    /// 
    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
{
    /// 
    /// 测试程序
    /// 
    class EventDemo
    {
        public static void Main()
        {
            KeyInputMonitor monitor = new KeyInputMonitor();
            EventReceiver receiver = new EventReceiver(monitor);
            monitor.Run();
        }
    }
}

运行结果:

C#中事件(event)_第1张图片

你可能感兴趣的:(#,C#)