深圳网站设计比较好的公司上海市住房和城乡建设厅
深圳网站设计比较好的公司,上海市住房和城乡建设厅,it从零开始学大概要学多久,网站设计制作系统哪个好在所有关于C#事件机制的介绍中#xff0c;我更倾向于发布者/订阅者#xff08;Publisher/Subscriber#xff09;这种描述。理解事件机制并不是一件容易的事情#xff0c;它所涉及的思想值得我们好好去研究。 本文资源来自《C#与.NET技术平台实战演练》——中国青年出版社 …在所有关于C#事件机制的介绍中我更倾向于发布者/订阅者Publisher/Subscriber这种描述。理解事件机制并不是一件容易的事情它所涉及的思想值得我们好好去研究。 本文资源来自《C#与.NET技术平台实战演练》——中国青年出版社 谈到事件我们涉及到两个角色事件发布者Publisher和事件订阅者Scriber也可以说是事件发送者Sender和事件接收者Receiver的关系。举个例子来说市面上目前有许多杂志杂志的种类也很多。而我只对其中的某些感兴趣那么我就可以向杂志发行商提出订阅。之后每当杂志发行时我就会收到我在杂志发行商那儿订阅的杂志。在这个关系中杂志发行商就相当于事件发行者而我就是事件订阅者。每当杂志发行时就触发了一个发行事件。
用面向对象的语言解释这两者的意义如下
事件发行者Publisher
它是一个对象且会维护自身的状态信息。每当状态信息发生变动时便触发一个事件并通知所有的事件订阅者。对于杂志发行商来说每本杂志都有自己的信息在里面当杂志发行时我要通知订阅该杂志的人杂志已经发行啦请注意查收
事件接收者Receiver
这个对象要注册它感兴趣的对象也就是订阅它自己喜欢的杂志啦。另外这个对象通常要提供一个事件处理方法在事件发行者触发一个事件后会自动执行这个方法。对于上面所举的例子来说也就是我收到杂志后要做什么事情比如你可以满世界地大喊我收到杂志啦也可以将杂志收藏起来慢慢欣赏具体怎么实现完全取决你自己的喜好。
以下是.NET事件处理机制的模型 下面给一个简单的例子用以阐述事件的思想 1using System; 2using System.Collections.Generic; 3using System.Text; 4 5namespace EventDemo 6{ 7 public delegate void SalaryCompute(); //声明一个代理类 8 9 public class Employee 10 { 11 public event SalaryCompute OnSalaryCompute; //定义事件将其与代理绑定 12 13 public virtual void FireEvent() //触发事件的方法 14 { 15 if (OnSalaryCompute ! null) 16 { 17 OnSalaryCompute(); //触发事件 18 } 19 } 20 } 21 22 public class HumanResource 23 { 24 public void SalaryHandler() //事件处理函数 25 { 26 Console.WriteLine(Salary); //只是打印一行字而已 27 } 28 29 public static void Main() 30 { 31 Employee ep new Employee(); 32 HumanResource hr new HumanResource(); 33 ep.OnSalaryComputenew SalaryCompute(hr.SalaryHandler); //注册 34 ep.FireEvent(); //触发事件 35 Console.Read(); 36 } 37 } 38} 39 在这个例子中Employee类相当于一个事件发布者Publisher它定义了事件的相关信息包括定义了一个事件用于计算薪水OnSalaryCompute以及一个触发事件的函数FireEvent为简单起见本例没有加上事件参数。与之相对应HumanResource类则相当于一个事件订阅者Subscriber它定义了一个事件处理函数SalaryHandler并用将其与事件联系起来从而使事件触发的时候能够调用我这个方法在本例中也就是打印一行字啦。值得注意的一点是事件处理函数的方法签名要与代理的方法签名相同这是非常重要的一点。 下面将这个例子改造一下事件参数信息用以完善事件机制。1using System; 2using System.Collections.Generic; 3using System.Text; 4using System.Threading; 5 6namespace EventDemo 7{ 8 public delegate void SalaryCompute(object sender,MyEventArgs e); //声明一个代理类 9 10 public class Employee 11 { 12 public event SalaryCompute OnSalaryCompute; //定义事件将其与代理绑定 13 14 public virtual void FireEvent(MyEventArgs e) //触发事件的方法 15 { 16 if (OnSalaryCompute ! null) 17 { 18 OnSalaryCompute(this,e); //触发事件 19 } 20 } 21 } 22 23 public class MyEventArgs : EventArgs //定义事件参数类 24 { 25 public readonly double _salary; 26 public MyEventArgs(double salary) 27 { 28 this._salary salary; 29 } 30 } 31 32 public class HumanResource 33 { 34 public void SalaryHandler(object sender,MyEventArgs e) //事件处理函数其签名应与代理签名相同 35 { 36 Console.WriteLine(Salary is {0},e._salary); //只是打印一行字而已 37 } 38 39 public static void Main() 40 { 41 Employee ep new Employee(); 42 HumanResource hr new HumanResource(); 43 MyEventArgs e new MyEventArgs(123.40); 44 ep.OnSalaryComputenew SalaryCompute(hr.SalaryHandler); //注册 45 for (; ; ) 46 { 47 Thread.Sleep(1000); //让程序“睡”一秒 48 ep.FireEvent(e); //触发事件 49 } 50 //Console.Read(); 51 } 52 } 53} 54
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/88369.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!