很多朋友在学习C#的过程中感到比较头疼的一个难题就是事件和委托,灵活应用事件和委托是提升.net水平的一个关键,
而如何正确理解事件和委托是根本所在。本文试着用一种诙谐通俗的说法给你讲解事件和委托,在笑笑之余,深刻理解和记忆
什么是事件和委托。
故事一:现代社会生活节奏太快,很多人忙于工作而无暇顾及感情问题,因此特别是我们IT界出现很多钻石王老五。呵呵,
因此现在出现了如何和陌生美女搭讪的培训班。现在模拟下整个培训过程[本故事构思来源于sohu的一篇文章]。
阶段一:什么都要老师教。
学生甲:遇到活泼类型美女怎么搭讪?老师:搭讪方法(美女类型 活泼类型)
学生已:遇到文静类型美女怎么搭讪?老师:搭讪方法(美女类型 文静类型)
学生丙:遇到职业白领类型美女怎么搭讪?老师:搭讪方法(美女类型 职业白领类型)
........................
如此下去,各学生开始去实验了
public void 实验(美女a)
{
if(美女a.类型==活泼类型)
{
搭讪方法(美女类型 活泼类型);
}
else if(美女a.类型==文静类型)
{
搭讪方法(美女类型 文静类型);
}
else if(美女a.类型==职业白领类型)
{
搭讪方法(美女类型 职业白领类型);
}
.....................
}
阶段二:学会综合应用了,会同时用老师教的几种方法了。因为人的性格是多样的,因此对同一美女只有一种方法还不行,所以有的人学会了对一个人用多种方法。
如果按照阶段一的水平,老师又得提供了以下几个方法。
public void 搭讪方法1(文静和职业白领综合类型 某类型美女)
{
搭讪方法(美女类型 文静类型);
搭讪方法(美女类型 职业白领类型);
}
public void 搭讪方法2(活泼和职业白领类型 某类型美女)
{
搭讪方法(美女类型 活泼类型);
搭讪方法(美女类型 职业白领类型);
}
学生又开始试验了//这次我们遇到美女b,是文静和职业白领综合类型。
搭讪方法1(美女b);//美女c,是活泼和职业白领类型,那得又写个方法了
搭讪方法2(美女c)//碰到美女d,是.....类型,那又得写个搭讪方法3了。
搭讪方法3(美女d)长此以往写的累啊,我们能不能写个类之类的东西(委托就是一种特殊的类,最后给大家总结)来代表所有的方法(注意这个类是用来代表方法的,专业一点是方法的引用,或指向方法的指针)。当然可以了,程序员的最高使命就是实现,没什么不可能的。于是我们定义个委托(特别的类)来代表方法。
public delegate void 搭讪方法的委托(美女类型 某种类型);[注:为什么写搭讪方法的委托,大家要从字面上理解,这个东西就是来委托真的要执行的那个方法去执行的。]
这样在泡MM的时候,老师只告诉他下面一个方法就好了
public void 老师提供的搭讪方法(美女类型 某类型,搭讪方法 某方法)
{
}那么学生如何去具体做呢?
public void 实验(美女类型 b类型美女)
{
//首先是文静类型的
搭讪方法的委托 b类型美女搭讪要委托执行的方法= 搭讪方法(美女类型 文静类型);
//其次是职业白领类型的
b类型美女搭讪要委托执行的方法 += 搭讪方法(美女类型 职业白领类型);//添加完你要委托的方法,开始具体泡MM了
老师提供的搭讪方法(b类型美女,b类型美女搭讪要委托执行的方法);
}看到了么,碰到了美女,你想用哪种方法就加哪种方法,不用if-else来判断了,不错吧。
阶段三:青出于蓝而胜于蓝的阶段,还会自己创造老师没有的方法来泡MM。这次我们对刚提到的委托固定一个引用,(前面是每个MM我们要声明一个委托,然后在这个委托的基础上加搭讪的方法)以后甭管咋样,我都用这个固定的委托来添加方法。public event 搭讪方法的委托 搭讪事件[注:其实就是固定一个委托的引用,以后都用这个了,不许自己定义];
这时用不着老师,自己会创造了,出山了。
public void 实验(美女类型 超级美女M)
{
搭讪事件+=new 搭讪方法的委托(自己创造的搭讪方法一(超级美女M));
搭讪事件+=new 搭讪方法的委托(自己创造的搭讪方法二(超级美女M));
搭讪事件+=new 搭讪方法的委托(自己创造的搭讪方法三(超级美女M));
//想用多少种方法,自己自由发挥啊
.............................
}private void 自己创造的搭讪方法一(美女类型 m)
{
//自己自由发挥
}private void 自己创造的搭讪方法二(美女类型 m)
{
//自己自由发挥
}private void 自己创造的搭讪方法三(美女类型 m)
{
//自己自由发挥
}总结一下:委托就是对方法的抽象,事件就是对委托的固定引用,对这个委托常例化。就像我们的按钮事件,a按钮点击调用一个方法,b按钮点击调用一个方法,后来我们对按钮的点击都抽象成固定成Click事件,然后你想添加什么方法就添加什么方法。这篇文章所写的方法,具体是客户端(调用端)的还是服务端的可能大家有些混淆,搭讪方法都是老师教的(老师类,服务端),除了后来自己创造的。实验方法都是客户端(调用端)。
补充:本来还准备给大家准备个故事的,还给大家结合设计模式谈谈委托和事件的,没想到写第一故事就这么占版面,就算了。我想大家好好理解这个就差不多了,然后看看其他blog里关于委托和事件的文章,我相信你一定能突破这个难点的。祝你成功!欢迎大家拍砖批评和指正,不胜感激!