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; }