文斌的博客

学无止境
随笔 - 85, 文章 - 1, 评论 - 131, 阅读 - 26万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

委托和事件 转

Posted on   文斌1988  阅读(172)  评论(0编辑  收藏  举报

很多朋友在学习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里关于委托和事件的文章,我相信你一定能突破这个难点的。祝你成功!欢迎大家拍砖批评和指正,不胜感激!

作者:Jackhuclan
出处:http://jackhuclan.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示