前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#中事件(event)

C#中事件(event)

作者头像
卡尔曼和玻尔兹曼谁曼
发布2019-01-25 15:15:57
2.2K0
发布2019-01-25 15:15:57
举报
文章被收录于专栏:给永远比拿愉快

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

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

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

(1)创建一个委托

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

(3)编写事件处理程序

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

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

保存事件信息的类

代码语言:javascript
复制
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;
        }
    }
}

事件发行者

代码语言:javascript
复制
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);
        }
    }
}

事件订户

代码语言:javascript
复制
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);
        }
    }
}

如何调用

代码语言:javascript
复制
namespace ConsoleApplication.EventDemo
{
    /// <summary>
    /// 测试程序
    /// </summary>
    class EventDemo
    {
        public static void Main()
        {
            KeyInputMonitor monitor = new KeyInputMonitor();
            EventReceiver receiver = new EventReceiver(monitor);
            monitor.Run();
        }
    }
}

运行结果:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014年03月29日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档