您的位置:首页 > 编程语言 > C#

关于C#.Net中事件(event)、委托(delegate)和方法的一点理解

2011-08-20 17:35 756 查看
  学习C#几年了,其中最让我纠结的是事件、委托和方法三者的关系。由于很多情况下,事件和委托的工作都由编译器帮我们做好了,如我们只要简单地双击一下控件,系统便会自动生成事件处理方法,并绑定好事件。以致于有很多即便是有多个项目经验的人都不知道事件、委托到底长的是什么样子?
  MSDN对委托的定义是:委托是.Net框架中通常用于建立事件处理机制的类。一组方法被封装到一个特定的委托方法队列中,然后事件发生的时候就去调用委托(触发事件),接着委托方法队列中的方法就会被依次调用(响应事件)。

  MSDN对事件好像没有一个很明确的定义。只是说“事件是特殊类型的多路广播委托,仅可从声明它们的类或结构(发行者类)中调用。如果其他类或结构订阅了该事件,则当发行者类引发该事件时,会调用其事件处理程序方法”。

  这些定义,简直越看越让人眼花!暂且不管这些定义,下面我写了一个控件台程序,并自定义事件和委托,模拟单击button控件时整个事件的经过。

 整个过程主要由一个事件、一个委托、一个方法完成。代码如下:

 //首先模拟EventHandler,山寨一个 MyEventHandler,参数也来一个山寨版的MyEventArgs 类型

  delegate void MyEventHandler(object sender,MyEventArgs e);

   //再山寨一个MyForm,模拟Form窗体类

    class MyForm
    {
        MyButton btn;
        public MyForm()
        {
            btn = new MyButton("button1");
            btn.MyClick += new MyEventHandler(this.btn_MyClick);
            btn.OnClick();//通过onclick触发事件
        }

        void btn_MyClick(object sender, MyEventArgs e)
        {
            Console.WriteLine("单击了" + e.Msg + "按钮!");
        }
    }

 //山寨一个MyButton模拟Button类

    class MyButton
    {
        public event MyEventHandler MyClick; //申明事件
         private MyEventArgs e;
        public string Name;
        public MyButton(string btnName)
        {
            e = new MyEventArgs();
            e.Msg = btnName;
            this.Name = btnName;
        }
        public void OnClick()
        {
            MyClick(this, e);
        }
    }
    //山寨版的EventArgs
    class MyEventArgs
    {
        private string msg;
        public string Msg
        {
            get { return this.msg; }
            set { this.msg = value; }
        }
    }

 //程序入口

 class Program
    {
        static void Main(string[] args)
        {
            new MyForm();
            Console.ReadLine();
        }
    }


  如果整个过程模拟的没有错的话,那么我们可以来分析事件、委托和方法之间的关系:

  首先来看一下他们的所属关系。事件(MyClick)是在MyButton类里面声明的,并且由MyButton对象负责触发,他是属于MyButton的财产。委托(MyEventHandler)在一开始就申明了,不是在任何类中声明,属于全世界人民公有。方法(btn_MyClick)是在MyForm类里面生成的,他属于MyForm对象。到这里已经可以看出他们仨分居各地,实际上已经为MyButton对象和MyForm对象通信合作作好准备了。

  再来分析一下他们的运作流程。在各个模块准备就序后,由 btn.MyClick += new MyEventHandler(this.btn_MyClick)接好线路,一方面是连接好控件对象的MyClick事件和MyEventHandler委托,另一方面是连接好MyEventHandler委托和窗体对象的btn_MyClick方法,这样一来,只等btn.OnClick()一声令下,整个过程就一气呵成了。控件对象的MyClick事件就成功地利用MyEventHandler委托执行了窗体对象的处理方法btn_MyClick。到了这里你不是才发现委托原来真的是委托啊!它只是负责接线,整个故事从头到尾,委托只是个打酱油的而已。

   到这里你也许就明白了MyForm类中的void btn_MyClick(object sender, MyEventArgs e)方法的两个参数到底是哪里冒出来的了。

  如有错误,敬请大虾指正!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: