• 由听雨轩事件委托例子想到的…


    今天看了博客园听雨轩讲解的一篇关于事件和委托的例子。文章的地址在下面

    http://www.cnblogs.com/finesite/articles/255884.html

    这篇文章写的很不错。读完后,也说说我的感想:

    首先说说事件的编写。对于一个事件编写,会涉及以下几个方面:

    1. 定义一个事件
    2. 触发一个事件
    3. 定义事件的方法
    4. 订阅事件,退订事件

    定义事件

    事件就是一个委托变量,所以形成如下:

    public event delegateName eventName;

    为了好看,微软都将事件的委托变量名字加EventHandler,所以你看见的基本都是

    public event NumberReachedEventHandler NumberReached;

    和定义一个string变量差不多:

    public string AString;

    但是多一个event关键字。

    到这里你应该就自然想到一点,这个委托变量NumberReachedEventHandler我还没有定义啊,所以,你需要定义一个委托签名:

    public delegate void NumberReachedEventHandler(object sender, NumberReachedEventArgs e);

    委托定义了,这个时候你就自然想到和委托签名代表的方法还没定义:

    private void oCounter_NumberReached(object sender, NumberReachedEventArgs e)
    {
         MessageBox.Show("Reached: " + e.ReachedNumber.ToString());
     }

    前面的事件的定义,委托签名的定义都是形式,真正的实质是这里的方法。这里的方法代表着要触发一个什么样的事件。

    这里触发的事件就是出现一个MessageBox Show ReachedNumber的值。

    触发事件

    触发事件的代码主要在这里:

    class Counter
        {
            // 定义一个事件
            // 事件一个是委托变量
            public event NumberReachedEventHandler NumberReached;
    
            public Counter()
            { 
                //
                // TODO: Add constructor logic here
                //
            }
    
            public void CountTo(int countTo, int reachableNum)
            {
                if (countTo < reachableNum)
                    throw new ArgumentException("ReachableNum should be less than countTo");
                for (int ctr = 0; ctr <= countTo; ctr++)
                {
                    // 当数字到达ReachableNum的时候触发事件
                    if (ctr == reachableNum)
                    {
                        NumberReachedEventArgs e = new NumberReachedEventArgs(reachableNum);
                        OnNumberReached(e);
                        
                    }
                }
            }
    
            protected virtual void OnNumberReached(NumberReachedEventArgs e)
            {
                if (NumberReached != null)
                {
                    NumberReached(this, e);
                }
            }
        }

    但是要触发这个事件的前提是要订阅了这个事件才起作用

    订阅事件

     //
                // 订阅事件
                //
                oCounter.NumberReached += new NumberReachedEventHandler(oCounter_NumberReached);

    给oCounter的NumberReached事件订阅一个相关的方法oCounter_NumberReached.

    那剩下的来分析下这个NumberReachedEventArgs类

     public class NumberReachedEventArgs : EventArgs
        {
            private int reached;
    
            public NumberReachedEventArgs(int num)
            {
                this.reached = num;
            }
    
            public int ReachedNumber
            {
                get
                {
                    return reached;
                }
            }
        }
    
    它其实是没什么东西的,只是起着传递一个ReachedNumber的作用。
    伪python爱好者,正宗测试实践者。
  • 相关阅读:
    tp5 宝塔open_basedir restriction in effect 错误; IIS open_basedir restriction in effect
    如何封装一个自己的win7系统并安装到电脑做成双系统
    推荐7个模板代码和其他游戏源码下载的网址
    PHP简单实现异步多文件上传并使用Postman测试提交图片
    PHP公众号开发给用户发微信消息提醒功能
    解决在页面中无法获取qrcode.js生成的base64的图片
    如何使用GUID硬盘分区格式安装新windows系统
    超详细的纯净windows系统重装示例
    Spark之join、leftOuterJoin、rightOuterJoin及fullOuterJoin
    Spark中groupByKey、reduceByKey与sortByKey
  • 原文地址:https://www.cnblogs.com/herbert/p/1753302.html
Copyright © 2020-2023  润新知