今天看了博客园听雨轩讲解的一篇关于事件和委托的例子。文章的地址在下面
http://www.cnblogs.com/finesite/articles/255884.html
这篇文章写的很不错。读完后,也说说我的感想:
首先说说事件的编写。对于一个事件编写,会涉及以下几个方面:
- 定义一个事件
- 触发一个事件
- 定义事件的方法
- 订阅事件,退订事件
定义事件
事件就是一个委托变量,所以形成如下:
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的作用。