学了delegate委托还有event事件的联系,基本学明白了。先总结一下吧。[转载]

说白了,其实delegate和eventhandler之间,就是有一道纸,捅破了,就没有那么神秘了。首先我说一下我自己编程的顺序,以免大家看到网上一大堆的道理,就是自己编不出来。那是为什么呢?我给你说出来。
首先,需要明白,delegate和event这样的程序,必须有一个发生事件的类,然后还要有一个接收一个事件并做出相应反映的类。第一个类我们就叫MySource吧,意思就是源;后面的那个类我们就叫做MyAction类吧。除了这两个类以外,还需要有一个委托类即delegate类型的类。好了,一共三个东西,即MySource类,MyAction类,Delegate类,三个,然后把他们堆砌在一起。里面先不要写东西。看到这里,没有不懂得地方吧。在你的某个XXX.cs文件里面这么写:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace DelegateEvent
  6. {
  7.    //这里写出delegate类
  8.    public Delegate MyDelegate(object sender, eventargs e)
  9.    public class MySource
  10.    {
  11.    }
  12.    public class MyAction
  13.    {
  14.    }
  15. }
恩,看到了吗?上面。这么简单,应该不成问题吧?就是三个东西。然后呢?我们先把MyAction给充实了吧,我们就让MyAction里面有一个函数,输出一些字符串吧!
  1. public class MyAction
  2. {
  3.    public void Do(Object sender,EventArgs e)
  4.    {
  5.       console.writeline("你好,我是事件处理程序,如果你看到了,说明我被调用了。哈哈。");
  6.    }
  7. }
看到了吧?这个事件处理程序等着MySource来调用。具体怎么调用,一会儿再说。下一步呢?我们充实一下MySource类。
根据微软的MSDN的套路,我也建议大家看看我的MySource里面的写法。关于事件和delegate的网址是:
http://msdn.microsoft.com/zh-cn/library/9aackb16.aspx
如果嫌我说话啰嗦,就看msdn去,不过上面写清楚了,就是解释不清楚,对于初学者,还是看我这个啰嗦点,我认为比较好。
上面需要注意的一点是:public void do(Object sender,EventArgs e),这是事件处理程序,这个函数的参数Object sender,EventArgs e必须要跟delegate类MyDelegate的参数一直。你看看我的,是不是一致?呵呵。
然后呢?我们开始写MySource类,MySource类里面有三个东西需要记住,记住了就会写了。
1,定义一个MyDelegate的一个事件成员。即在MySource里面这么写 :
  1. public class MySource
  2.     {
  3.         public event MyDelegate MyEvent;
  4.        
  5.     }
看到了吧?都是固定写法,说明这是一个事件成员,名字叫MyEvent。
2、需要写一个开始程序,表示程序要开始运行了。这么写:
  1. public class MySource
  2.     {
  3.         public event MyDelegate MyEvent;
  4.         
  5.         public void Start()
  6.         {
  7.             EventArgs e = new EventArgs();
  8.             OnStart(e);
  9.         }
  10.     }

在这个开始程序里面,首先定义一个参数,这里不传递什么参数,但是也要写上。然后呢,执行Onstart(e)函数。下面写出Onstart函数

  1. public class MySource
  2.     {
  3.         public event MyDelegate MyEvent;
  4.         public void OnStart(EventArgs e)
  5.         {
  6.             MyDelegate handler = MyEvent;
  7.             if (handler != null)
  8.             {
  9.                 handler(this,e);
  10.             }
  11.         }
  12.         public void Start()
  13.         {
  14.             EventArgs e = new EventArgs();
  15.             OnStart(e);
  16.         }
  17.     }

Onstart函数是需要一个eventArgs参数的,这就是为什么start里面是OnStart(e)。在里面,将定义的MyEvent事件成员赋值给同样是MyDelegate类型的handler,然后这个时候handler就是一个接收两个参数this,e的delegate了。好了,现在这三块砖已经搭建起来了。下面就是怎么使用了。

在programe.cs里面这样写:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace DelegateEvent
  6. {
  7.     class Program
  8.     {
  9.         static void Main(string[] args)
  10.         {
  11.             MyAction myAction = new Action();
  12.             MySource mySource = new Source();
  13.             mySource.MyEvent += new MyDelegate(myAction.Do);
  14.             mySource.Start();
  15.         }
  16.     }
  17. }

说白了,其实很简单,首先类MyAction和MySource各定义一个实例。myAction,mySource两个。然后呢。。写出:

 mySource.MyEvent += new MyDelegate(myAction.Do); 语句。

就是将myAction.Do的事件处理程序让MyDelegate引用,怎么使用呢?就是让mySource.MyEvent调用。mySource.MyEvent里面MyEvent是mySource的成员,当然可以这么调用。同时,在onstart里面,MyEvent给了handler,于是handler(this,e)执行的话,就等于出发了myAction.Do程序。

明白啦?

最后结果输出:

 

我是一个事件处理程序,我
请按任意键继续. . .


原文地址:https://www.cnblogs.com/beeone/p/2009873.html