尽管 (委托、事件与Observer设计模式 )中的范例很好地完成了我们想要完成的工作,但是我们不仅疑惑:为什么.Net Framework 中的事件模型和上面的不同?为什么有很多的EventArgs参数?

在回答上面的问题之前,我们先搞懂 .Net Framework的编码规范:

l         委托类型的名称都应该以EventHandler结束。

l         委托的原型定义:有一个void返回值,并接受两个输入参数:一个Object 类型,一个 EventArgs类型(或继承自EventArgs)。

l         事件的命名为 委托去掉 EventHandler之后剩余的部分。

l         继承自EventArgs的类型应该以EventArgs结尾。

再做一下说明:

1.       委托声明原型中的Object类型的参数代表了Subject,也就是监视对象,在本例中是 Heater(热水器)。回调函数(比如Alarm的MakeAlert)可以通过它访问触发事件的对象(Heater)。

2.       EventArgs 对象包含了Observer所感兴趣的数据,在本例中是temperature。

上面这些其实不仅仅是为了编码规范而已,这样也使得程序有更大的灵活性。比如说,如果我们不光想获得热水器的温度,还想在Observer端(警报器或者显示器)方法中获得它的生产日期、型号、价格,那么委托和方法的声明都会变得很麻烦,而如果我们将热水器的引用传给警报器的方法,就可以在方法中直接访问热水器了。

现在我们改写之前的范例,让它符合 .Net Framework 的规范:

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, BoliedEventArgs e);

public event BoiledEventHandler Boiled;//声明事件

// 定义BoliedEventArgs类,传递给Observer所感兴趣的信息

public class BoliedEventArgs : EventArgs {

public readonly int temperature;

public BoliedEventArgs(int temperature) {

this.temperature = temperature;

}

}

// 可以供继承自 Heater 的类重写,以便继承类拒绝其他对象对它的监视

protected virtual void OnBolied(BoliedEventArgs e) {

if (Boiled != null) {   // 如果有对象注册

Boiled(this, e);    // 调用所有注册对象的方法

}

}

// 烧水。

public void BoilWater() {

for (int i = 0; i <= 100; i++) {

temperature = i;

if (temperature > 95) {

//建立BoliedEventArgs 对象。

BoliedEventArgs e = new BoliedEventArgs(temperature);

OnBolied(e);    // 调用 OnBolied方法

}

}

}

}

// 警报器

public class Alarm {

public void MakeAlert(Object sender, Heater.BoliedEventArgs 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.BoliedEventArgs 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();//烧水,会自动调用注册过对象的方法

}

}

}

输出为:

Alarm:China Xian - RealFire 001:

Alarm: 嘀嘀嘀,水已经 96 度了:

Alarm:China Xian - RealFire 001:

Alarm: 嘀嘀嘀,水已经 96 度了:

Alarm:China Xian - RealFire 001:

Alarm: 嘀嘀嘀,水已经 96 度了:

Display:China Xian - RealFire 001:

Display:水快烧开了,当前温度:96度。

// 省略 ...

总结

在本文中我首先通过一个GreetingPeople的小程序向大家介绍了委托的概念、委托用来做什么,随后又引出了事件,接着对委托与事件所产生的中间代码做了粗略的讲述。

在第二个稍微复杂点的热水器的范例中,我向大家简要介绍了 Observer设计模式,并通过实现这个范例完成了该模式,随后讲述了.Net Framework中委托、事件的实现方式。

转自: http://hi.baidu.com/txh1204

转载于:https://www.cnblogs.com/runy/archive/2009/08/18/1548651.html

转载(四).Net Framework中的委托与事件相关推荐

  1. .Net Framework中的委托与事件

    using System; using System.Collections.Generic; using System.Text;namespace Delegate {// 热水器public c ...

  2. 观察者模式与.Net Framework中的委托与事件

    本文文字内容均选自<大话设计模式>一书. 解释:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够 ...

  3. C# 中的委托和事件(转载)

    C# 中的委托和事件 (今天去因为委托和事件这两个东西把我搞得头疼死了,偶然发现这篇文章,觉得非常不错,就copy过来了!) 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而 ...

  4. [转载] 张子阳 --- C# 中的委托和事件

    引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...

  5. C# 中的委托和事件

    引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...

  6. C# 中的委托和事件(1)

    C# 中的委托和事件 欢迎浏览本文的后续文章: C#中的委托和事件(续) PDF 浏览:http://www.tracefact.net/Document/Delegates-and-Events-i ...

  7. 【转】C# 中的委托和事件

    阅读目录 C# 中的委托和事件 引言 将方法作为方法的参数 将方法绑定到委托 事件的由来 事件和委托的编译代码 委托.事件与Observer设计模式 .Net Framework中的委托与事件 总结 ...

  8. C# 中的委托和事件[转]

    引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...

  9. [轉]C# 中的委托和事件

    轉自:http://www.cnblogs.com/jimmyzhang/archive/2007/09/23/903360.html pdf:http://www.tracefact.net/Doc ...

最新文章

  1. Java高并发编程:HandlerThread
  2. 昂贵的聘礼(poj 1062)
  3. Kafka消费者详解
  4. C++构造函数语意学
  5. 2019-03-15-算法-进化(有效的数独)
  6. linux 下搭建yolov3错误,Ubuntu20.04+cuda11.1+yolo3 目标检测 深度学习系统 真正从0搭建 包含各类可能遇到的错误...
  7. POJ 1200 Crazy Search(RK)
  8. 继续教育自动听课软件_荣耀小口哨app下载-华为荣耀小口哨软件v1.9.9 安卓最新版 - 极光下载站...
  9. 使用python来操作hive(通过 pyhs2 和 HiveServer2)
  10. ef core 批量update 非id_Entity Framework (EF) Core
  11. C语言入门了解篇—C语言编译流程
  12. web字体设置成平方字体_Web字体正确完成
  13. PostgreSQL应用(二,客户端工具————CRUD)
  14. Hibernate逍遥游记-第13章 映射实体关联关系-005双向多对多(使用组件类集合\composite-element\)...
  15. 防汛抗洪中,北峰应急通信小系统如何筑起通信防线
  16. AEJoy —— 详解 AE 如何将 png 序列帧导出为 SVGA 动画文件
  17. 生物在计算机应用,生物技术在计算机领域中的应用有哪些
  18. mysql ping命令_MySQL常用命令总结
  19. Android中内存优化
  20. WPS编辑器实现自定义小功能

热门文章

  1. LeetCode 241. 为运算表达式设计优先级(动态规划)
  2. LeetCode 599. 两个列表的最小索引总和(哈希map)
  3. ubuntu自定义安装里怎么选_中央空调到底应该怎么选?小户型也能安装中央空调?行家说实话了...
  4. 在c#中用mutex类实现线程的互斥_面试官经常问的synchronized实现原理和锁升级过程,你真的了解吗...
  5. Python实现给指定的微信朋友发信息
  6. 刷新页面,无论点击多少次让Element UI的Message消息提示弹出一个
  7. 谷歌提出 RNN 版 Transformer,或为长文本建模的当前最优解
  8. 谷歌 | 多任务学习,如何挑选有效的辅助任务?只需一个公式!
  9. 文末送书 | Facebook:易于解释的神经元可能会阻碍神经网络的学习
  10. 论文浅尝 | 基于图匹配神经网络的跨语言知识图对齐 (ACL 2019)