网站备案哪里管,wordpress更新文章收录,wordpress插件如何使用,湖南网站开发公司电话尽管 #xff08;委托、事件与Observer设计模式 #xff09;中的范例很好地完成了我们想要完成的工作#xff0c;但是我们不仅疑惑#xff1a;为什么.Net Framework 中的事件模型和上面的不同#xff1f;为什么有很多的EventArgs参数#xff1f; 在回答上面的问题之前委托、事件与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();//烧水会自动调用注册过对象的方法 } } } 输出为 AlarmChina Xian - RealFire 001: Alarm: 嘀嘀嘀水已经 96 度了 AlarmChina Xian - RealFire 001: Alarm: 嘀嘀嘀水已经 96 度了 AlarmChina Xian - RealFire 001: Alarm: 嘀嘀嘀水已经 96 度了 DisplayChina 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