当前位置: 首页 > 编程语言 > C# > 正文

C#3.0笔记(二)预备知识之委托与事件

时间:2010-12-16 博客园 Henllyee Cui

在上篇blog中简单地介绍了委托的基础知识,在这片文章中会介绍下委托跟 事件之间的联系。

事件的由来

我们可以看到在使用委托进行回调 的实现的时候,我们往往需要再定义一个委托对象,以及一个对外公开的辅助方 法来添加委托的方法,这样子会使我们感觉比较繁琐。C#提供了event关键字来 减轻直接使用委托的负担,编译器会自动提供注册、取消注册的方法和委托必要 的成员。首先来看看定义事件的步骤:

1.先定义委托类型;

2.通 过event关键字定委托类型的事件。

public delegate int  Caculate(int x, int y);

  public event Caculate OnCaculate;

看看编译器帮我们 定义了什么

首先我们可以看到帮我们定义了一个Caculate对象,其次定义了两个方法 add_OnCaculate跟remove_OnCaculate。我们可以在看看add_OnCaculate两个方 法里面的一些核心的东西。add_OnCaculate:

IL_0008: call
 class [mscorlib]System.Delegate [mscorlib] System.Delegate::Combine(class [mscorlib]System.Delegate,
                                   class [mscorlib]System.Delegate)

很明显地看到 add_OnCaculate方法调用的就是委托的Combine方法,从而我们也可以想到 remove_OnCaculate方法调用的是Remove方法。从上面我们可以看到其实event关 键字只是提供给我们了一种语法上的便利措施。

一个稍微完整的例子

这个例子参考的是《C#与.NET3.0高级程序设计》上面的。使用Car来举 例的,当车子加速时到一定限制值时会触发一个预警事件,当超过某一个速度时 会触发一个车子爆炸事件。首先看委托跟事件:

public  delegate void CarEventHandler(string msg);

  public event CarEventHandler AbortToBlow;

  public event CarEventHandler Exploded;

EventCar类 中有两个事件一个是AbortToBlow一个是Exploded。下面是Car的几个属性以及字 段:

private const int MaxSpeed = 180;

  public int CurrSpeed { get; private set; }

  public bool IsDead { get; private set; }

  public string Name { get; private set; }