.NET自定义事件小结
最近因为工作的事情想了很多,此处略去三千字吧。。。
还是把事件这个技术拿过来沉淀一下,继续学习,继续提高自己,好吧,废话不多说,进入正题吧~
关于事件各位应该都不陌生,相信每个程序员都可以拍着胸脯说“事件?我知道啊~”,可如何自定义事件?也许有人心中就不是那么底气十足了。还是老规矩吧,高手绕行~
用很多地方都被引用到泛滥的一个例子来写吧,始作俑者就不去深究了。描述是这样的:小偷进入时,事件发送者(狗)发送狗叫事件(自定义),(事件接收者)主人订阅狗叫事件并处理(抓住小偷),事件的参数传递的是小偷的数量。
下面就给出实现的具体步骤---已经在代码注释中标明,以供各位博友抽象出自定义事件的流程。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 自定义事件 { //http://www.cnblogs.com/DebugLZQ //自定义事件步骤的示例代码 //0.定义事件传递的参数 class AlarmEventArgs : EventArgs { public int numberOfThief; public AlarmEventArgs(int n) { numberOfThief = n; } } //事件的发出者 class Dog { //1.声明事件的委托 public delegate void AlarmEventHandler(Object sender, AlarmEventArgs e); //2.声明事件 public event AlarmEventHandler Alarm; //3.引发事件的函数 public void OnAlarm(AlarmEventArgs e) { if (this.Alarm != null) { Console.WriteLine("The dog is Wangwang..."); this.Alarm(this, e); } } } //事件的订阅者 class Host { //4.订阅事件 public Host(Dog dog) { dog.Alarm += new Dog.AlarmEventHandler(HostHandleEvent); } //5.事件处理程序 public void HostHandleEvent(Object sender, AlarmEventArgs e) { Console.WriteLine("Host caught the thief! The sum is "+e.numberOfThief); } } class Program { static void Main(string[] args) { Console.WriteLine("Program is running..."); Dog dog = new Dog(); Host host = new Host(dog); Console.WriteLine("Someone is coming..."); //6.在合适的时候引发事件 AlarmEventArgs alarmEventArgs = new AlarmEventArgs(3); dog.OnAlarm(alarmEventArgs); Console.ReadKey(); } } }
程序运行结果如下:
例子很简单,我是按照顺序写的,在代码中也有详细的步骤注释,就不多讲了。一般经验来讲,自定义的东西往往是很有用的,而往往也不是人人能够掌握,DebugLZQ总结了一下,也没有什么高端的技术,遇到了自定义事件的这个事情,写下来吧,心里也就不虚了~具体流程可能一千个人一千个哈姆雷特,看个人习惯~
本文自定义的CLR事件,关于自定义WPF的路由事件请参考:WPF 自定义路由事件
接下来英语口语要注意锻炼,技术要继续学习(重点是加强LINQ,WCF,WPF以及敏捷开发方面的知识),努力提高自己的专业素质,在此期间完成毕业论文。
时间又是很晚了~手指在键盘上流浪至天明吧~多么美丽的夜晚---So Beautiful !
=====================================================
Update:
我们可以使用.NET提供的EventHandler<TEventArgs> delegate来简化,事件的定义及使用,提高开发效率和代码质量~
如下(区别在步骤2和4,省略了1):
using System; namespace RefactorCustomizeEventDemo { //http://www.cnblogs.com/DebugLZQ //自定义事件步骤的示例代码 //0.定义事件传递的参数 class AlarmEventArgs : EventArgs { public int numberOfThief; public AlarmEventArgs(int n) { numberOfThief = n; } } //事件的发出者 class Dog { //2.声明事件 public event EventHandler<AlarmEventArgs> Alarm; //3.引发事件的函数 public void OnAlarm(AlarmEventArgs e) { if (Alarm != null) { Console.WriteLine("The dog is Wangwang..."); Alarm(this, e); } } } //事件的订阅者 class Host { //4.订阅事件 public Host(Dog dog) { // dog.Alarm += new EventHandler<AlarmEventArgs>(HostHandleEvent); // this line is equal to the next line dog.Alarm += HostHandleEvent; } //5.事件处理程序 public void HostHandleEvent(Object sender, AlarmEventArgs e) { Console.WriteLine("Host caught the thief! The sum is " + e.numberOfThief); } } class Program { static void Main(string[] args) { Console.WriteLine("Program is running..."); Dog dog = new Dog(); Host host = new Host(dog); Console.WriteLine("Someone is coming..."); //6.在合适的时候引发事件 AlarmEventArgs alarmEventArgs = new AlarmEventArgs(3); dog.OnAlarm(alarmEventArgs); Console.ReadKey(); } } }
步骤2:申明事件的最佳实践如下:
//2.声明事件 public event EventHandler<AlarmEventArgs> Alarm= delegate { };
程序运行如下:
Update:
请参考DebugLZQ后续博文:
WPF 4.5 New Feature:Using the WeakEvent pattern with WeakEventManager to avoid memory leaking
[C#] A simple implementation of the WeakEvent pattern
希望对你有帮助~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库