event 到底有什么用

ygy1223 2012-11-15 09:43:07

using System;
using System.Collections.Generic;
using System.Text;

namespace Delegate
{
// 热水器
public class Heater
{
private int temperature;
public string type = "RealFire 001"; // 添加型号作为演示
public string area = "China Xian"; // 添加产地作为演示
//声明委托
public delegate void BoiledEventHandler(Object sender, BoiledEventArgs e);
public event BoiledEventHandler Boiled; //声明事件

// 定义BoiledEventArgs类,传递给Observer所感兴趣的信息
public class BoiledEventArgs : EventArgs
{
public readonly int temperature;
public BoiledEventArgs(int temperature)
{
this.temperature = temperature;
}
}

// 可以供继承自 Heater 的类重写,以便继承类拒绝其他对象对它的监视
protected virtual void OnBoiled(BoiledEventArgs e)
{
if (Boiled != null)
{ // 如果有对象注册
Boiled(this, e); // 调用所有注册对象的方法
}
}

// 烧水。
public void BoilWater()
{
for (int i = 0; i <= 100; i++)
{
temperature = i;
if (temperature > 95)
{
//建立BoiledEventArgs 对象。
BoiledEventArgs e = new BoiledEventArgs(temperature);
OnBoiled(e); // 调用 OnBolied方法
}
}
}
}

// 警报器
public class Alarm
{
public void MakeAlert(Object sender, Heater.BoiledEventArgs e)
{
Heater heater = (Heater)sender; //这里是不是很熟悉呢?
//访问 sender 中的公共字段
Console.WriteLine("Alarm:{0} - {1}: ", heater.area, heater.type);
Console.WriteLine("Alarm: 嘀嘀嘀,水已经 {0} 度了:", e.temperature);
Console.WriteLine();
}
}

// 显示器
public class Display
{
public static void ShowMsg(Object sender, Heater.BoiledEventArgs e)
{ //静态方法
Heater heater = (Heater)sender;
Console.WriteLine("Display:{0} - {1}: ", heater.area, heater.type);
Console.WriteLine("Display:水快烧开了,当前温度:{0}度。", e.temperature);
Console.WriteLine();
}
}

class Program
{
static void Main()
{
Heater heater = new Heater();
Alarm alarm = new Alarm();

heater.Boiled += alarm.MakeAlert; //注册方法
heater.Boiled += (new Alarm()).MakeAlert; //给匿名对象注册方法
heater.Boiled += new Heater.BoiledEventHandler(alarm.MakeAlert); //也可以这么注册
heater.Boiled += Display.ShowMsg; //注册静态方法

heater.BoilWater(); //烧水,会自动调用注册过对象的方法
}
}
}




这里面有没有event关键字结果是一样的。事件到底有什么用处,为什么不直接用委托呢
...全文
235 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghui0380 2012-11-16
  • 打赏
  • 举报
回复
事件就是委托 我个人觉着不必太纠结了,你明白就ok。 分得清,南方的馄饨和北方的饺子,广东云吞,武汉的包面有啥区别,有多大意义呢?还是入乡随俗好了,去广东你就喊云吞,到四川你就要抄手 如果强行说,我只能说委托是从外给内传,事件则是由内给外面通知。 我不知道这里怎么做,这个需要外面传给我,多数就是委托 我不需要外面告诉我,我已经办好了,我是对外喊一声“东西办好了,你啥时候来取。你要是没别的事,我就走下一步了”
  • 打赏
  • 举报
回复
比如说,你可以试试,如果是简单的委托,你可以随便修改 heater.Boiled 赋值。而对于事件,基本上只能使用 += 和 -= 语法,比较安全。
  • 打赏
  • 举报
回复
事件本来就是一种委托,它更高级。
ygy1223 2012-11-16
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
至少让你少写了很多代码,这就是它的用处。 没有事件,至少每定义一个事件(多播委托),得多4、5行代码。
怎么少写代码,举个例子看看,谢谢啊
threenewbee 2012-11-15
  • 打赏
  • 举报
回复
至少让你少写了很多代码,这就是它的用处。 没有事件,至少每定义一个事件(多播委托),得多4、5行代码。

1,979

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 其他语言讨论
社区管理员
  • 其他语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧