委托与事件

原创 2012年03月26日 23:30:09

委托是一个引用方法类型,是对函数的封装,可以当做给方法的特征指定一个名称。用delegate声明,一旦为委托分配了方法,委托将与该方法具有完全相同的行为。
事件是委托的一种特殊形式,用event声明,事件是说在发生其它类或对象关注的事情时,类或对象可通过事件通知他们。
class Cat
    {
        private string name;
        public Cat(string name)
        {
            this.name = name;
        }
        public delegate void CatShoutEventHandler();   //声明委托CatShoutEventHandler (无参无返回值)
        public event CatShoutEventHandler CatShout;  //声明事件CatShout,她的事件类型是委托CatShoutEventHandler
        public void Shout() 
        {
            Console.WriteLine("喵,我是{0}.", name);
            if (CatShout != null)
            {
                CatShout();
            }
        }
    }
class Mouse
    {
        private string name;
        public Mouse(string name)
        {
            this.name = name;
        }
        public void run()          //用来逃跑的方法
        {
            Console.WriteLine("老猫来了,{0}快跑!", name);
        }
    }
 static void Main(string[] args)
        {
            Cat cat = new Cat("Tom");        //实例化老猫Tom和小老鼠Jerry和Jack
            Mouse mouse1 = new Mouse("Jerry");
            Mouse mouse2 = new Mouse("Jack");

            cat.CatShout += new Cat.CatShoutEventHandler(mouse1.run);   //将Mouse的run方法通过实例化委托Cat.CatShoutEventHandler登记到Cat的事件CatShout当中, +=表示增加委托实例对象,
//new Cat.CatShoutEventHandler(mouse1.run) 的含义是实例化一个委托,而委托的实例其实就是Mouse的run方法。
//猫叫事件触发老鼠快跑委托实例
            cat.CatShout += new Cat.CatShoutEventHandler(mouse2.run);
            cat.Shout();
            Console.Read();
        }
private void btn_Click(object sender,EventArgs e)
object sender是传递发送通知的对象,如sender为button对象,而EventArgs是包含事件数据的类,e为button的位置等参数。sender 产生事件的对象 e是点击事件的一些参数。this.button1.Click += new System.EventHandler(this.button1_Click);

new System.EventHandler(this.button1_Click);这段代码实际上是建立了一个委托类型的实例并让该委托指向了this.button1_Click方法。也就是说,在程序运行的“某一时刻”,系统会通过这个委托实例间接的调用this.button1_Click方法。

通过上面的说明,我们得到一个信息,前面这段事件注册代码,是让this.button1.Click和System.EventHandler(this.button1_Click)指向了同一段内存空间,简单来讲,就是让this.button1.Click指向了this.button1_Click方法,调用了this.button1.Click,就相当于调用了this.button1_Click方法。因此,我们说,当this.button1的Click事件发生之后,方法this.button1_Click就会被调用。

在程序运行的时候,系统会自己检测this.button1是否被点击了,如果被点击了,就在button1的内部调用button1.Click,这时,Windows窗口中的button1_Click方法就会被执行。

this.button1.Click = this.button1.Click +new System.EventHandler(this.button1_Click);

用自然语言来描述上面的代码就是“一个委托=这个委托本身+另外一个委托”。那么委托相加意味着什么呢?我们讨论过MultiDelegate(多播委托),而事件本身也是委托,并且所有委托都是System.MultiDelegate类的派生类,我们曾经演示过,多个委托类型实例相加,就是将这些委托实例存放在一个多播委托的调用链中,当调用多播委托时,该多播委托的调用链中的所有委托都会顺序的被调用。

利用多播委托的原理,我们可以将多个方法注册给一个事件,如下所示:
this.button1.Click +=new System.EventHandler(this.button1_Click);
this.button1.Click +=new System.EventHandler(this.button1_Click1);
this.button1.Click +=new System.EventHandler(this.button1_Click2);
上面的代码,就将三个方法注册到了button1的Click事件中,当button1的Click事件触发之后,方法button1_Click,button1_Click1,button1_Click2将会被顺序调用。这样作的好处是,我们可以将多个功能以及逻辑完全独立的操作放在不同的方法中,当事件发生之后,这些方法将会顺序的被调用,以实现我的需要的级联操作。

this.button1.Click +=new System.EventHandler(this.button1_Click);上面代码中,使用“newSystem.EventHandler(this.button1_Click)”将一个System.EventHandler委托类型的实例指向了this.button1_Click方法。我们知道,如果想让一个委托指向一个方法,那么该委托以及所被指向的方法一定要具备相同的签名(Signature,具备相同的参数列表,相同的返回值)。因此,System.EventHandler类型和this.button1_Click方法具备相同的签名,下面,我们来看一下System.EventHandler委托的签名是什么样的:

public delegate void EventHandler( Object sender,EventArgs e)

System.EventHandler的签名是:返回值为void;有两个参数,Object sender, EventArgs e。因此button1_Click方法也具备相同形式,代码如下:private void button1_Click(object sender, EventArgs e){}

实际上,我们所能够看到的事件回调方法的签名基本上都着不多,只不过第二个参数略有区别,下面,我们对该方法的参数进行说明。 Object sender 从该参数的命名上,可以看出其作用,sender(发送者)的意思是:谁触发的这个事件,那么sender就是谁,由于所有的类型在理论上讲都可以包括事件,因此sender的类型被定义成Object类型,当多个事件同时指向一个事件回调方法的时候,通过该参数可以区分出是哪一个类触发的事件,以便做出不同的处理,此时,需要对参数sender作出类型转化。案例操作020603:多个事件指向同一个回调方法 首先,添加三个Button,一个TextBox 界面如下:然后,在主窗口中添加一个方法ButtonClick,这三个按钮的Click事件将调用该方法。代码如下:protected void ButtonClick(object sender, EventArgs e) {Button bt = sender as Button; this.textBox1.Text ="我是:"+ bt.Text;}

上面代码中,为了知道点击的是哪个按钮,我们将sender转化成了Button类型。

下面来指定这三个按钮的Click事件回调方法

首先,切换到button1的属性窗口(F4),点击“”按钮,找到“Click”事件,并设置所调用的方法名为ButtonClick ,如下图所示。

然后,以相同的方法设置button2,button3的Click事件,并它们都指向ButtonClick方法。

最后,运行程序,下面是运行情况:

点击button1:

相关文章推荐

C#委托和事件

  • 2015年08月14日 17:18
  • 95KB
  • 下载

窗体传值 委托与事件的比较

  • 2014年09月22日 21:17
  • 36KB
  • 下载

观察者模式-猫捉老鼠(委托与事件)

猫捉老鼠是一个典型的观察者模式的实现案例,在其中加入委托与事件的程序实现,将会提高代码的一个可读性,其下是代码实现: 创建一个Cat类: using System; using Syste...

C# 中的委托和事件

  • 2015年05月15日 08:36
  • 222KB
  • 下载

C#学习日记 委托 事件

我个人的理解就是 委托里放着 要传递的方法,一个或者多个方法。一开始并不知道要执行什么方法,所以把方法当做参数传递。委托里的方法可以是私有的也可以是静态的。如果委托的方法用到了外部的变量就叫做闭包。如...

.net委托与事件代码

  • 2014年11月05日 11:29
  • 2KB
  • 下载

C#委托与事件(张子阳).pdf

  • 2012年10月21日 17:08
  • 634KB
  • 下载

Delegate,Action,Func,匿名方法,匿名委托,事件

一、委托Delegate一般的方法(Method)中,我们的参数总是string,int,DateTime...这些基本的数据类型(或者没有参数),比如public void HelloWorld()...

委托与事件

  • 2012年03月07日 14:32
  • 120KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:委托与事件
举报原因:
原因补充:

(最多只允许输入30个字)