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)方法的两个参数到底是哪里冒出来的了。
如有错误,敬请大虾指正!