上次聊了下委托(delegate),简单的介绍了下使用方法,顺便问下你家保姆干活还行么?今天我们来看看事件(event)。
事件实际上是一种特别的委托,通常声明事件的话要声明一个委托,它是这样的:
[code]csharpcode:
public delegate void EventHandler(object sender, EventArgs e);
是不是发现了些什么区别,对,参数!(object sender,EventArgs e)中sender表示是谁触发了这个事件,比如这是个点击事件,那一般就是按钮触发的。下面给出示例代码来理解下:
[code]csharpcode:
using System; using System.Collections.Generic; /// <summary> /// 首先,我们写的是一个事件的类,其中有一个KeyEventArgs的参数 /// 它是EventArgs的派生类,用来存储我们输入的字符 /// </summary> class MyEvent { private delegate void EventHandler(object sender, KeyEventArgs e); // 这里我们声明了一个委托看清楚他的参数类型,一个object,一个EventArgs或者是它的派生类 private event EventHandler doEvent; // 这里声明一个事件,***它的类型是委托*** public void OnEvent(KeyEventArgs e) { // 这里用来判断,事件发生时应该调用哪一个方法,将方法加入事件处理的队列中 switch (e.Key) { case "a": doEvent += new EventHandler(FunA); break; case "b": doEvent += new EventHandler(FunB); break; case "c": doEvent += new EventHandler(FunC); break; default: doEvent += new EventHandler(FunNull); break; } // 处理事件 doEvent(this, e); } // 不同事件的处理方法 private void FunA(object sender, KeyEventArgs e) { Console.WriteLine("输入 A"); } private void FunB(object sender, KeyEventArgs e) { Console.WriteLine("输入 B"); } private void FunC(object sender, KeyEventArgs e) { Console.WriteLine("输入 C"); } private void FunNull(object sender, KeyEventArgs e) { Console.WriteLine("输入未录入字符"); } }
[code]csharpcode:
using System; using System.Collections.Generic; /// <summary> /// 这是EventArgs的派生类,其中这个key就是用来储存我们输入的字符的 /// </summary> class KeyEventArgs : EventArgs { private string key; public string Key { get { return key; } set { key = value; } } }
有了上面两个类,我们的事件基本就定义好了,他们描述了(1)事件所需要的参数(2)参数所包含的内容(3)不同事件的处理方法。接下来我们要把这个事件用起来,还是看代码:
[code]csharpcode:
using System; using System.Collections.Generic; class MyListener { static void Main(string[] args) { while (true) // 这个只是为了让它能重复调用,不然用一次就没有 { MyEvent me = new MyEvent(); // 实例化事件类 KeyEventArgs e = new KeyEventArgs(); // 实例化参数类 e.Key = Console.ReadLine(); // 给参数类中的属性赋值 me.OnEvent(e); // 调用事件的函数 } } }
先看一下结果:
从结果看,同一个输入事件,根据不同的输入内容,调用不同的处理方法。
总结一下,我们如何来使用事件:
1. 声明一个特殊的委托,参数的类型为一个object,一个EventArgs或者它的派生类(如果不需要传递什么特别的信息的就直接用EventArgs);
2. 声明一个事件,它的类型就是上面声明的委托;
3. 声明处理事件的方法,就是如果这个事件发生了,我们需要做什么;
4. 然后就是根据事件发生的不同情况,把不同方法加入到事件中,就是doEvent += new EventHandler(FunNull)像这样的代码。
5. 最后一定要调用事件,如doEvent(this, e)。
PS:很多人看了很多教程都不明白事件到底怎么写,多是因为看了别人写的好像都是不一样的,很难找出规律来。这里我归纳一下,步骤1,2,3都是为事件的发生做准备的,步骤4,5是当事件发生的时候,我们该如何去使用之前的准备去处理它。所以,1,2,3几乎都是大同小异,4,5就有可能写法多种多样了,再看别人写的关于事件的教程时,把代码分类,应该就能比较好理解了。
以上就是小贱对委托,事件的一点浅显的理解,可能例子不合适,也有可能说的有错误,各位坛友都能直接向我提出来,我也能有机会更深入地去了解。