Html5移动网站,温州做网站哪里好,注册外国网站,辽宁网站定制企业在上一文我们已经大致介绍了关于事件的基础入门#xff0c;现在我们来一个事件的实战#xff0c;让大家更加深入的理解事件。这个代码也是观察者模式#xff0c;如果对这个模式不清楚#xff0c;可以看我上一个文章#xff1a;.NET进阶——深入理解委托#xff08;3…在上一文我们已经大致介绍了关于事件的基础入门现在我们来一个事件的实战让大家更加深入的理解事件。这个代码也是观察者模式如果对这个模式不清楚可以看我上一个文章.NET进阶——深入理解委托3事件入门一、前景提要1.1EventHandler介绍我们这个代码中的委托使用系统自带的EventHandler委托publicdelegatevoidEventHandler(object?sender,EventArgse);这个委托没有返回值但需要传递两个参数一个是object类型的一个是EventArgs类型的这两个参数分别是什么意思呢其实object类型就是调用者剩下的EventArgs就是要传递的参数我这么说可能有点不好理解接着看下去你就懂了。1.2 场景背景介绍你住在 “幸福小区”物业负责通知业主停水 / 停电等事宜第一步业主订阅通知张三、李四、王五去物业前台登记“停水通知一定要告诉我”对应代码里的 订阅事件第二步物业准备通知内容物业确定“明天2025-12-15上午 8 点到 12 点小区停水 4 小时原因是水管维修”对应代码里的WaterStopNotice参数第三步物业挨家挨户通知物业人员上门对每个登记的业主说“我是幸福小区物业sender通知你明天 8 点 - 12 点停水 4 小时e参数”对应代码里的Invoke传参第四步业主响应通知张三“知道了我囤点水”李四“我提前洗好衣服”王五“我提醒爸妈别忘接水”对应代码里的Buy方法执行不同逻辑。二、代码详情2.1 传递信息类WaterStopNoticepublicclassWaterStopNotice:EventArgs{publicDateTimeStopTime{get;set;}// 停水开始时间publicintDuration{get;set;}// 停水时长小时publicstringReason{get;set;}// 停水原因}首先这个类是我们需要传递的信息类可以看到它是继承自EventArgs类所以这个类是可以当成EventArgs类传递信息的。2.2 小区物业类CommunityPropertypublicclassCommunityProperty{publicstringPropertyName{get;set;}// 物业名称比如“幸福小区物业”publicstringPhone{get;set;}// 物业联系电话// 定义“停水通知”事件对外暴露业主只能订阅/取消publiceventEventHandlerWaterStopEvent;// 物业内部的“发通知”方法对应代码里的PublicShowpublicvoidSendWaterStopNotice(){Console.WriteLine($【{PropertyName}】开始通知业主停水事宜);// 准备通知详情e参数WaterStopNoticenoticenewWaterStopNotice(){StopTimenewDateTime(2025,12,15,8,0,0),Duration4,Reason小区主水管维修};// 触发事件挨家挨户通知传2个参数物业自己通知详情WaterStopEvent.Invoke(this,notice);}}可以看到在这个类中我们定义了两个属性还定义了一个事件publiceventEventHandlerWaterStopEvent;这个事件是把EventHanlder这个委托封装了我们在1.1讨论了它的两个参数一个是object类型一个是EventArgs类型现在我们把这个委托封装从事件后这个事件WaterStopEvent也就跟该委托一样只能接收带有两个参数object? sender和EventArgs e并且没有返回值的方法。其次我们还定义了触发方法SendWaterStopNotice这个方法里我们首先创建了WaterStopNotice的实例对象用这个实例对象来传递参数并且我们还触发了事件WaterStopEvent.Invoke(this, notice);即调用SendWaterStopNotice方法就可以触发绑定的事件。触发这个事件时我们传递了两个参数一个是this另一个是刚刚创建的实例noticenotice比较好理解就是我们创建的用来通知小区业主的信息但是前面的this是啥呢我们都知道this指向的是实例本身也就是说这里的this传递的是我们后续要将校区业主类CommunityProperty实例化后的那个对象那么为什么要传递这个实例对象呢想一想如果你是小区业主当有人通知你要停水时你是不是要确认一下对方是谁只有确认对方是物业后你才会选择相信。那么这里也是一样的道理由于我们的对象中有两个属性一个是PropertyName物业名字另一个是物业的电话Phone所以我们要把这些信息也传递给小区业主让他们知道发起这个消息的是谁并且发起消息的人的电话。2.2 物业类HouseOwnerpublicclassHouseOwner{publicstringName{get;set;}// 业主姓名publicintHouseNumber{get;set;}// 门牌号// 接收通知的方法对应代码里的Buy// sender 物业实例e 停水通知详情publicvoidReceiveNotice(object?sender,EventArgse){// 第一步确认是谁发的通知把sender转回物业类型CommunityPropertypropertysenderasCommunityProperty;if(propertynull){Console.WriteLine(${Name}{HouseNumber}号收到不明通知忽略);return;}// 第二步获取通知详情把e转回停水通知类型WaterStopNoticenoticeeasWaterStopNotice;if(noticenull){Console.WriteLine(${Name}{HouseNumber}号通知内容无效);return;}// 第三步根据通知做准备不同业主反应不同Console.WriteLine($\n【{Name}{HouseNumber}号】收到通知);Console.WriteLine($ 通知方{property.PropertyName}联系电话{property.Phone});Console.WriteLine($ 停水时间{notice.StopTime:yyyy-MM-dd HH:mm});Console.WriteLine($ 停水时长{notice.Duration}小时);Console.WriteLine($ 停水原因{notice.Reason});// 不同业主的个性化操作if(Name张三)Console.WriteLine($ 张三的操作立刻去超市买2桶矿泉水);elseif(Name李四)Console.WriteLine($ 李四的操作现在就把衣服洗了热水器加满水);elseif(Name王五)Console.WriteLine($ 王五的操作给爸妈打电话提醒接水);}}在这个类中我们定义了一个方法publicvoidReceiveNotice(object?sender,EventArgse){......}这个方法接收object? sender, EventArgs e两个参数没有返回值这个方法的签名完全符合我们之前说的EventHandle委托的要求即符合WaterStopEvent的要求。并且我们在方法内部也是通过object sender拿到了小区物业的姓名和电话通过EventArgs获取了停水通知的各个详细信息。2.4 执行整个流程// 1. 创建发布者幸福小区物业CommunityPropertypropertynewCommunityProperty(){PropertyName幸福小区物业,Phone010-12345678};// 2. 创建观察者3个业主HouseOwnerzhangsannewHouseOwner(){Name张三,HouseNumber101};HouseOwnerlisinewHouseOwner(){Name李四,HouseNumber202};HouseOwnerwangwunewHouseOwner(){Name王五,HouseNumber303};// 3. 业主订阅通知去物业登记property.WaterStopEventzhangsan.ReceiveNotice;property.WaterStopEventlisi.ReceiveNotice;property.WaterStopEventwangwu.ReceiveNotice;// 4. 物业发通知触发事件传递参数property.SendWaterStopNotice();这里我们首先创建了一个小区物业的实例并且声明了他的名称和电话。然后创建了三个业主声明了每个业主的姓名和房间号。随后我们让每个业主订阅了物业的通知即property.WaterStopEvent zhangsan.ReceiveNotice;由于WaterStopEvent是一个事件外部只能订阅或者取消订阅-。订阅之后这些方法会被放到WaterStopEvent事件中等待调用。而最终执行SendWaterStopNotice()方法后这个事件会被调用。比如当执行了SendWaterStopNotice()方法后这个代码会触发事件WaterStopEvent.Invoke(this, notice);将小区物业的实例property和停水消息WaterStopNotice传入事件由于事件中的第一个方法是张三的所以执行zhangsan.ReceiveNotice(object? sender, EventArgs e)。剩下两个方法也是以此类推。执行结果【幸福小区物业】开始通知业主停水事宜 【张三101号】收到通知 通知方幸福小区物业联系电话010-12345678 停水时间2025-12-15 08:00 停水时长4小时 停水原因小区主水管维修 张三的操作立刻去超市买2桶矿泉水 【李四202号】收到通知 通知方幸福小区物业联系电话010-12345678 停水时间2025-12-15 08:00 停水时长4小时 停水原因小区主水管维修 李四的操作现在就把衣服洗了热水器加满水 【王五303号】收到通知 通知方幸福小区物业联系电话010-12345678 停水时间2025-12-15 08:00 停水时长4小时 停水原因小区主水管维修 王五的操作给爸妈打电话提醒接水2.5 总结生活场景代码里的元素核心作用幸福小区物业CommunityProperty实例发布者控制通知时机、传参数停水通知事件WaterStopEvent事件订阅入口仅允许 /-停水详情时间 / 时长WaterStopNoticee 参数传递具体的通知内容物业自己发通知的人thissender 参数告诉观察者 “谁发的通知”业主登记通知property.WaterStopEvent 方法订阅加入通知列表物业挨家挨户通知WaterStopEvent.Invoke(this, notice)触发事件传递参数给每个业主业主按通知做准备ReceiveNotice方法响应执行个性化逻辑这个代码也是一个非常典型观察者模式非常值得大家学习。