不少人说,事件即委托。真的是这样吗?那么微软为什么又要定义事件与委托两个概念呢?
其实事件即委托,在我看来不如这样解释:事件是封装过的委托实例。也就是说,事件是面向对象的产物,它是封装性比较典型的示例。安全
事件其实是一个特殊的委托实例,不用事件也没有关系。实际上事件只是削弱了委托的功能,event在编译器角度保护了你程序的安全,由于你只能使用+=、-=来注册事件了,而不能使用 = 为事件关联方法。(在委托中还能够使用=来绑定方法,不过=是一种破坏性代码,无论以前是否已经绑定的有方法了,他都会将其清除)函数
同一个方法你能够使用委托来调用,你也能够使用事件来调用。那究竟有何不一样?
其实事件就是一个狭义的委托,也就是事件是一个用于事件驱动模型的专用委托.你能够在客户代码中直接调用委托来激发委托指向的函数,而事件不能够,事件的触发只能由服务代码本身触发。也就是说在你的代码里委托你不但能够安排谁是它的调用函数,还能够直接调用它,而事件不能直接调用,只能经过某些操做触发。除此之此,事件拥有委托的全部功能,包括多播特性。即事件能够有多个事件处理函数,委托一样也能够是个多播委托.对象
public class Heater
{
private int temperature;
public void BoilWater()
{
for (int i = 1; i <= 100; i++)
{
temperature = i;
if (temperature > 95 && BoilEvent != null)
{
//执行委托,无需知道要执行哪些方法
BoilEvent(temperature);
}
}
}
public delegate void BoilHandle(int param);
public event BoilHandle BoilEvent;//封装了委托
}
public class Alarm
{
public void MakeAlert(int param)
{
Console.WriteLine("Alarm:水温已经超过{0}度.",param);
}
}
public class Display
{
public void ShowMsg(int param)
{
Console.WriteLine("Display:水已烧开,当前温度{0}度.", param);
}
}
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
Heater heater = new Heater();
Alarm alarm = new Alarm();
heater.BoilEvent += alarm.MakeAlert;
heater.BoilEvent += new Display().ShowMsg;
heater.BoilWater();
}
}事件