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

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

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爱好者,正宗测试实践者。
原文地址:https://www.cnblogs.com/herbert/p/1753302.html