关于C#.Net中事件(event)、委托(delegate)和方法的一点理解
2011-08-20 17:35
756 查看
学习C#几年了,其中最让我纠结的是事件、委托和方法三者的关系。由于很多情况下,事件和委托的工作都由编译器帮我们做好了,如我们只要简单地双击一下控件,系统便会自动生成事件处理方法,并绑定好事件。以致于有很多即便是有多个项目经验的人都不知道事件、委托到底长的是什么样子?
MSDN对委托的定义是:委托是.Net框架中通常用于建立事件处理机制的类。一组方法被封装到一个特定的委托方法队列中,然后事件发生的时候就去调用委托(触发事件),接着委托方法队列中的方法就会被依次调用(响应事件)。
MSDN对事件好像没有一个很明确的定义。只是说“事件是特殊类型的多路广播委托,仅可从声明它们的类或结构(发行者类)中调用。如果其他类或结构订阅了该事件,则当发行者类引发该事件时,会调用其事件处理程序方法”。
这些定义,简直越看越让人眼花!暂且不管这些定义,下面我写了一个控件台程序,并自定义事件和委托,模拟单击button控件时整个事件的经过。
整个过程主要由一个事件、一个委托、一个方法完成。代码如下:
如果整个过程模拟的没有错的话,那么我们可以来分析事件、委托和方法之间的关系:
首先来看一下他们的所属关系。事件(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)方法的两个参数到底是哪里冒出来的了。
如有错误,敬请大虾指正!
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)方法的两个参数到底是哪里冒出来的了。
如有错误,敬请大虾指正!
相关文章推荐
- 从callback的角度来理解.NET/C# 中的 委托 (delegate)与 事件 (event)
- 从callback的角度来理解.NET/C# 中的 委托 (delegate)与 事件 (event)
- (zz)从callback的角度来理解.NET/C# 中的 委托 (delegate)与 事件 (event)
- 从callback的角度来理解.NET/C# 中的 委托 (delegate)与 事件 (event)
- 关于C# 委托(delegate)与事件(event)的用法及事例
- 关于C#的delegate(委托)和event(事件)的使用
- 关于C# 委托(delegate)与事件(event)的用法及事例
- 对于新手用c#中的delegate(委托)和event(事件)
- 关于C#中的委托和事件的个人理解
- 关于C#事件和委托的一点体会
- 终于会用c#中的delegate(委托)和event(事件)了 [转]
- C# 委托delegate 和 事件event
- c#中的delegate(委托)和event(事件)
- c#中的delegate(委托)和event(事件)
- 终于会用c#中的delegate(委托)和event(事件)了
- 终于会用c#中的delegate(委托)和event(事件)了
- 看看可爱c#中的delegate(委托)和event(事件)用法好不好
- 关于Asp.net web控件事件处理的一点理解
- C# delegate 委托 event 事件
- 对C#下函数,委托,事件的一点理解