在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
分类索引:C# 语言和运行时剖析--前言
相关概念概念
事件提供者类型的设计一. 定义类型来容纳所有需要发送给事件订阅者的附加信息
using System; using System.Linq; namespace ConsoleTest { public class NewMailEventArgs : EventArgs { private readonly string from, to, subject; public NewMailEventArgs(string from, string to, string subject) { this.from = from; this.to = to; this.subject = subject; } public string Subject { get { return this.subject; } } public string To { get { return this.to; } } public string From { get { return this.from; } } } }
二. 定义事件成员。
方法一: public delegate void NewMailHandler(object e, NewMailEventArgs args); public class MailManager { public event NewMailHandler NewMail; } 方法二: public class MailManager { public event EventHandler<NewMailEventArgs> NewMail; } 为什么这两种方法能够达到同样的效果,查看一下System.EventHandler的定义就能知晓: namespace System { // 摘要: // 表示将处理事件的方法。 // // 参数: // sender: // 事件源。 // // e: // 一个包含事件数据的 System.EventArgs。 // // 类型参数: // TEventArgs: // 由该事件生成的事件数据的类型。 [Serializable] public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e); } 三. 定义一个统一触发事件的方法入口来通知事件的订阅对象。
示例如下: public class MailManager { public event EventHandler<NewMailEventArgs> NewMail; protected virtual void OnNewMail(NewMailEventArgs e) { //处于线程安全的考虑,现在将对委托字段的引用复制到一个临时字段中 EventHandler<NewMailEventArgs> temp = System.Threading.Interlocked.CompareExchange (ref NewMail, null, null); //如果有事件订阅者对象的存在,则通知他们,事件已触发 if (temp != null) temp(this, e); } } 四. 在所有需要触发事件的业务方法中,调用第三步中定义的方法。
示例如下: public class MailManager { public event EventHandler<NewMailEventArgs> NewMail; protected virtual void OnNewMail(NewMailEventArgs e) { //处于线程安全的考虑,现在将对委托字段的引用复制到一个临时字段中 EventHandler<NewMailEventArgs> temp = System.Threading.Interlocked.CompareExchange (ref NewMail, null, null); //如果有事件订阅者对象的存在,则通知他们,事件已触发 if (temp != null) temp(this, e); } public void SimulateNewMail(string from, string to, string subject) { //构造一个对象来封装向传给事件订阅者的信息 NewMailEventArgs e = new NewMailEventArgs(from, to, subject); //触发事件引发的入口方法 OnNewMail(e); } }
事件订阅者类型的设计一. 定义类型来订阅和侦听事件
internal sealed class Fax { private MailManager mailManager; public Fax(MailManager mm) { this.mailManager = mm; } public void Register() { mailManager.NewMail += new EventHandler<NewMailEventArgs>(FaxMsg); } void FaxMsg(object sender, NewMailEventArgs e) { Console.WriteLine("Fax mail message"); Console.WriteLine("From = {0}, To = {1}, Subject = {2}", e.From, e.To, e.Subject); } public void Unregister() { mailManager.NewMail -= FaxMsg; } }
参考阅读 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论