科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件C#中的委托和事件

C#中的委托和事件

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

委托和事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C

作者:佚名 来源:论坛整理 2007年11月11日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
以下是引用片段:
  namespace Delegate {
  //定义委托,它定义了可以代表的方法的类型
  public delegate void GreetingDelegate(string name);
  //新建的GreetingManager类
  public class GreetingManager{
  public void GreetPeople(string name, GreetingDelegate MakeGreeting) {
  MakeGreeting(name);
  }
  }
  class Program {
  private static void EnglishGreeting(string name) {
  Console.WriteLine("Morning, " + name);
  }
  private static void ChineseGreeting(string name) {
  Console.WriteLine("早上好, " + name);
  }
  static void Main(string[] args) {
  // ... ...
  }
  }
  }

  这个时候,如果要实现前面演示的输出效果,Main方法我想应该是这样的:

以下是引用片段:
  static void Main(string[] args) {
  GreetingManager gm = new GreetingManager();
  gm.GreetPeople("Jimmy Zhang", EnglishGreeting);
  gm.GreetPeople("张子阳", ChineseGreeting);
  }

  我们运行这段代码,嗯,没有任何问题。程序一如预料地那样输出了:

  Morning, Jimmy Zhang

  早上好, 张子阳

  现在,假设我们需要使用上一节学到的知识,将多个方法绑定到同一个委托变量,该如何做呢?让我们再次改写代码:

以下是引用片段:
  static void Main(string[] args) {
  GreetingManager gm = new GreetingManager();
  GreetingDelegate delegate1;
  delegate1 = EnglishGreeting;
  delegate1 += ChineseGreeting;
  gm.GreetPeople("Jimmy Zhang", delegate1);
  }

  输出:

  Morning, Jimmy Zhang

  早上好, Jimmy Zhang

  到了这里,我们不禁想到:面向对象设计,讲究的是对象的封装,既然可以声明委托类型的变量(在上例中是delegate1),我们何不将这个变量封装到 GreetManager类中?在这个类的客户端中使用不是更方便么?于是,我们改写GreetManager类,像这样:

以下是引用片段:
  public class GreetingManager{
  //在GreetingManager类的内部声明delegate1变量
  public GreetingDelegate delegate1;
  public void GreetPeople(string name, GreetingDelegate MakeGreeting) {
  MakeGreeting(name);
  }
  }

  现在,我们可以这样使用这个委托变量:

以下是引用片段:
  static void Main(string[] args) {
  GreetingManager gm = new GreetingManager();
  gm.delegate1 = EnglishGreeting;
  gm.delegate1 += ChineseGreeting;
  gm.GreetPeople("Jimmy Zhang", gm.delegate1);
  }

  尽管这样达到了我们要的效果,但是似乎并不美气,光是第一个方法注册用“=”,第二个用“+=”就让人觉得别扭。此时,轮到Event出场了,C# 中可以使用事件来专门完成这项工作,我们改写GreetingManager类,它变成了这个样子:

以下是引用片段:
  public class GreetingManager{
  //这一次我们在这里声明一个事件
  public event GreetingDelegate MakeGreet;
  public void GreetPeople(string name, GreetingDelegate MakeGreeting) {
  MakeGreeting(name);
  }
  }

  很容易注意到:MakeGreet 事件的声明与之前委托变量delegate1的声明唯一的区别是多了一个event关键字。看到这里,你差不多明白到:事件其实没什么不好理解的,声明一个事件不过类似于声明一个委托类型的变量而已。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章