再谈CLR:事件定义
这是今天课堂上的一个话题。如何定义事件,这好像并不是问题,我们习惯性直接用下面的代码定义,不是吗?
class Customer { public event EventHandler NameChanging; }
这样做的话,大致是会怎么编译呢?
其实编译器会帮我们生成两个方法: add_NameChanging和remove_NameChanging
还会有一个字段,是EventHandler这个类型的 。
关键就在这里。它每次都会在创建对象的时候准备一个EventHandler,但问题是,并不是每个事件都会被用到。这就意味着,有一部分EventHandler其实是浪费的。
如果类型的事件很多,那么这个问题可能比较明显。
如何改进呢?
请参考下面的代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Employee e = new Employee(); e.NameEvent += new EventHandler(e_NameEvent); e.LNameEvent += new EventHandler(e_LNameEvent); e.Name = "ares"; e.LName = "chen"; Console.Read(); } static void e_LNameEvent(object sender, EventArgs e) { Employee emp = (Employee)sender; Console.WriteLine(emp.LName); } static void e_NameEvent(object sender, EventArgs e) { Employee emp = (Employee)sender; Console.WriteLine(emp.Name); } } class Employee { private string name; public string Name { get { return name; } set { name = value; if (list[nameEventKey] != null) list[nameEventKey].DynamicInvoke(new object[] { this, null }); } } private string lname; public string LName { get { return lname; } set { lname = value; if (list[lnameEventKey] != null) list[lnameEventKey].DynamicInvoke(new object[] { this, null }); } } private EventHandlerList list = new EventHandlerList(); private object nameEventKey=null; public event EventHandler NameEvent { add { if (nameEventKey == null) nameEventKey = new object(); list.AddHandler(nameEventKey, value); } remove { if (nameEventKey == null) nameEventKey = new object(); list.RemoveHandler(nameEventKey, value); } } private object lnameEventKey=null; public event EventHandler LNameEvent { add { if (lnameEventKey == null) lnameEventKey = new object(); list.AddHandler(lnameEventKey, value); } remove { if (lnameEventKey == null) lnameEventKey = new object(); list.RemoveHandler(lnameEventKey, value); } } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人