邢台市桥西住房建设局网站可以做游戏的网站

张小明 2026/1/2 18:10:11
邢台市桥西住房建设局网站,可以做游戏的网站,61源码网,这么做网站原型图为什么我要把事件放在委托这个专题里呢#xff1f;主要的原因是事件是委托的高级封装。 换句话说#xff0c;先有委托才有事件#xff0c;委托是事件的基础#xff0c;事件是委托的封装。 我们先看一个不用委托的例子#xff0c;这个代码要求实现这样的功能#xff1a;小…为什么我要把事件放在委托这个专题里呢主要的原因是事件是委托的高级封装。换句话说先有委托才有事件委托是事件的基础事件是委托的封装。我们先看一个不用委托的例子这个代码要求实现这样的功能小猫叫-小孩哭-妈妈安慰-爸爸询问-邻居抱怨这样的一个由小猫叫引发的一系列事件。同时这个例子也是一个简单的观察者模式如果没有了解过观察者模式请大家仔细阅读代码或者询问AI大模型相信你可以理解。usingSystem;// 第一步定义委托小猫叫的方法签名无参数、无返回值publicdelegatevoidCatCryHandler();// 第二步定义猫类发布者包含公共委托字段publicclassCat{// 公开的委托字段无任何封装publicCatCryHandlerCatCryDelegate;// 小猫叫的方法publicvoidMiao(){Console.WriteLine( 小猫喵呜~~~);// 调用委托触发所有绑定的方法CatCryDelegate?.Invoke();}}// 第三步定义订阅者小孩、妈妈、爸爸、邻居publicclassChild{publicvoidCry()Console.WriteLine( 小孩哇呜呜呜怕怕~);}publicclassMother{publicvoidComfort()Console.WriteLine( 妈妈宝宝不怕妈妈抱~);}publicclassFather{publicvoidAsk()Console.WriteLine( 爸爸咋了猫又叫了);}publicclassNeighbor{publicvoidAngry()Console.WriteLine( 邻居大半夜的吵死了);}// 测试代码classProgram{staticvoidMain(string[]args){// 1. 创建对象CatkittynewCat();ChildchildnewChild();MothermomnewMother();FatherdadnewFather();NeighborneighbornewNeighbor();// 2. 绑定委托订阅kitty.CatCryDelegatechild.Cry;kitty.CatCryDelegatemom.Comfort;kitty.CatCryDelegatedad.Ask;kitty.CatCryDelegateneighbor.Angry;// ❌ 问题1外部可以直接赋值覆盖所有之前的绑定// 比如不小心写了而不是之前的4个方法全没了kitty.CatCryDelegatechild.Cry;// 现在委托里只剩小孩哭其他都没了// ❌ 问题2外部可以直接调用委托不用等小猫叫Console.WriteLine( 外部直接调用委托小猫还没叫);kitty.CatCryDelegate.Invoke();// 直接触发小孩哭逻辑混乱// ❌ 问题3外部可以直接置空委托清空所有绑定kitty.CatCryDelegatenull;// 3. 调用小猫叫方法但委托已经被置空啥都不执行Console.WriteLine(\n 小猫真的叫了 );kitty.Miao();Console.ReadLine();}}运行结果暴露的坑 外部直接调用委托小猫还没叫 小孩哇呜呜呜怕怕~ 小猫真的叫了 小猫喵呜~~~能看到直接用公共委托字段外部可以随意修改、触发、清空委托完全破坏了 “只有小猫叫才触发动作” 的逻辑 —— 这就是事件要解决的核心问题给委托加 “保护罩”。二、第二步引入事件解决委托的坑事件的本质就是 “封装委托的保护罩”只开放「订阅」和「取消订阅-」禁止外部赋值、直接调用、置空。核心改法把委托字段换成事件只需要改猫类里的一行代码再理解事件的核心规则即可publicclassCat{// ❌ 原来的公共委托字段有坑// public CatCryHandler CatCryDelegate;✅// 改成事件基于同一个委托publiceventCatCryHandlerCatCryEvent;publicvoidMiao(){Console.WriteLine( 小猫喵呜~~~);// 只有猫类内部能调用事件触发委托CatCryEvent?.Invoke();}}三、完整的 “小猫叫 事件” 实现从头写逐行解释下面是完整、可运行的代码每一步都配解释跟着看就能懂usingSystem;// 第一步定义委托事件的“底层契约”// 委托定义了“小猫叫要触发的方法”的签名无参数、无返回值// 所有要绑定到事件的方法必须符合这个签名publicdelegatevoidCatCryHandler();// 第二步定义发布者猫类拥有事件publicclassCat{// 定义事件语法是「public event 委托类型 事件名;」// 编译器会自动生成私有委托字段 仅开放/-的add/remove方法publiceventCatCryHandlerCatCryEvent;// 小猫叫的核心方法只有这个方法能触发事件publicvoidMiao(){Console.WriteLine(\n 小猫喵呜~~~);// 触发事件调用底层委托只有猫类内部能执行这行代码// ?. 是“空值保护”如果没有订阅者委托为null不会报错CatCryEvent?.Invoke();}}// 第三步定义订阅者关注小猫叫的对象// 订阅者1小孩publicclassChild{publicstringName{get;}publicChild(stringname)Namename;// 订阅方法签名必须和委托CatCryHandler一致无参数、无返回值publicvoidCry()Console.WriteLine(${Name}哇呜呜呜怕小猫~);}// 订阅者2妈妈publicclassMother{publicstringName{get;}publicMother(stringname)Namename;publicvoidComfortChild()Console.WriteLine(${Name}宝宝不怕小猫不咬人~);}// 订阅者3爸爸publicclassFather{publicstringName{get;}publicFather(stringname)Namename;publicvoidCheckCat()Console.WriteLine(${Name}别慌我去看看小猫~);}// 订阅者4邻居publicclassNeighbor{publicstringName{get;}publicNeighbor(stringname)Namename;publicvoidComplain()Console.WriteLine(${Name}谁家的猫啊吵死了);}// 第四步使用事件订阅、触发、取消订阅classProgram{staticvoidMain(string[]args){// 1. 创建发布者小猫CatkittynewCat();// 2. 创建订阅者ChildxiaoMingnewChild(小明);MotherliLinewMother(李丽);FatherzhangSannewFather(张三);NeighborwangYenewNeighbor(王大爷);// 3. 订阅事件外部只能用 不能用Console.WriteLine( 开始订阅小猫叫事件 );kitty.CatCryEventxiaoMing.Cry;// 小明订阅小猫叫→小明哭kitty.CatCryEventliLi.ComfortChild;// 李丽订阅小猫叫→妈妈安慰kitty.CatCryEventzhangSan.CheckCat;// 张三订阅小猫叫→爸爸查看kitty.CatCryEventwangYe.Complain;// 王大爷订阅小猫叫→邻居抱怨// 4. 触发事件只能通过猫类的Miao方法外部不能直接调用Console.WriteLine(\n 第一次小猫叫 );kitty.Miao();// 5. 取消订阅外部只能用 -Console.WriteLine(\n 王大爷取消订阅 );kitty.CatCryEvent-wangYe.Complain;// 王大爷不想听了取消订阅// 6. 再次触发事件Console.WriteLine(\n 第二次小猫叫王大爷已取消);kitty.Miao();// ❌ 以下操作全部编译报错事件的保护机制注释掉可验证// kitty.CatCryEvent xiaoMing.Cry; // 错误不能用赋值只能/-// kitty.CatCryEvent.Invoke(); // 错误外部不能直接触发事件// kitty.CatCryEvent null; // 错误外部不能置空事件Console.ReadLine();}}运行结果符合预期无安全隐患 开始订阅小猫叫事件 第一次小猫叫 小猫喵呜~~~ 小明哇呜呜呜怕小猫~ 李丽宝宝不怕小猫不咬人~ 张三别慌我去看看小猫~ 王大爷谁家的猫啊吵死了 王大爷取消订阅 第二次小猫叫王大爷已取消 小猫喵呜~~~ 小明哇呜呜呜怕小猫~ 李丽宝宝不怕小猫不咬人~ 张三别慌我去看看小猫~四、拆解事件的核心规则结合小猫例子用表格总结每一条都对应上面的代码一看就懂操作 / 规则具体说明小猫例子是否允许定义事件猫类里写public event CatCryHandler CatCryEvent;✅ 必须在类内部定义订阅事件外部用kitty.CatCryEvent 方法名如 xiaoMing.Cry✅ 外部仅允许这个操作取消订阅外部用kitty.CatCryEvent - 方法名如- wangYe.Complain✅ 外部仅允许这个操作触发事件只有猫类内部能写CatCryEvent?.Invoke()在 Miao 方法里❌ 外部绝对不能直接赋值事件外部写kitty.CatCryEvent xiaoMing.Cry❌ 编译报错置空事件外部写kitty.CatCryEvent null❌ 编译报错事件的本质编译器自动生成 “私有委托字段 仅开放 /- 的方法”✅ 不用自己写编译器帮你封装五、进阶用内置委托Action简化代码实战常用上面我们自定义了CatCryHandler委托实际开发中可以用 .NET 内置的Action无参数、无返回值省去自定义委托的步骤代码更简洁usingSystem;// 猫类直接用Action定义事件无需自定义委托publicclassCat{// 用内置Action替代自定义CatCryHandlerpubliceventActionCatCryEvent;publicvoidMiao(){Console.WriteLine(\n 小猫喵呜~~~);CatCryEvent?.Invoke();}}// 订阅者、测试代码和之前完全一样无需修改// 因为Action的签名就是“无参数、无返回值”和我们的订阅方法匹配运行结果和之前完全一致但少写了public delegate void CatCryHandler();这一行 —— 这是实际开发中最常用的写法。总结核心要点记牢这 3 条就够了事件的本质是委托的 “安全封装”就像给委托加了个 “保护罩”只允许外部做「订阅」和「取消订阅-」核心权限只有定义事件的类猫类能触发事件调用Invoke外部只能订阅 / 取消订阅不能赋值、不能直接触发、不能置空使用流程定义委托或用内置 Action/Func→ 类里定义事件 → 外部订阅事件 → 类内部触发事件 → 可选外部取消订阅。用小猫叫的例子再梳理一遍猫事件拥有者只在 “叫” 的时候触发事件小孩 / 妈妈 / 邻居订阅者只能选择 “听”订阅或 “不听”取消订阅不能强迫猫叫外部触发也不能把别人的 “听” 权限删掉覆盖委托—— 这就是事件的核心逻辑。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

专业做视频的网站厦门网站建设2

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个智能打包优化工具,能够:1. 自动检测Python项目结构 2. 根据项目类型(数据分析/GUI/爬虫等)选择最优打包方案 3. 预编译.pyc文件加速打包 4. 自动排除…

张小明 2026/1/1 6:49:51 网站建设

做企业网站排名wordpress com

随着人工智能技术不断持续地演进,有一种架构范式被称作“智能体”,它正变成连接大语言模型与现实世界复杂任务的关键桥梁。被简称为智能体的AI智能体,不是一个全新概念,不过其内涵在通用人工智能技术取得突破之后,得到…

张小明 2026/1/1 9:59:44 网站建设

南昌seo网站设计哪个cms好用

PyQt数据库编程全解析 1. 连接数据库 在对数据库进行操作之前,我们需要先建立与数据库的连接。在许多数据库应用程序中,这一操作通常在创建 QApplication 对象之后、主窗体创建或显示之前完成。不过,也有一些应用程序会在后续需要时才建立连接。 要使用PyQt的SQL类,我…

张小明 2026/1/1 17:18:47 网站建设

番禺怎样优化网站建设游戏推广网站如何做的

文章目录知识准备道具准备共阳极管和共阴极管的介绍代码实现心得拓展本实验将指导你如何使用Arduino控制一个1位数码管显示数字0到9。数码管是一种常见的显示设备,广泛应用于电子设备中。实验将涵盖知识准备、道具准备、数码管类型介绍、代码实现、心得和拓展部分&a…

张小明 2026/1/1 16:52:27 网站建设

为什么有的公司做很多个网站小程序搭建的方式

简单来说,这些 USER CODE BEGIN 和 USER CODE END 包裹的区域是 “代码保护区”。1. 这些区域是什么?为什么要这样设计?STM32CubeMX 是一个图形化配置工具,它可以自动帮你生成底层驱动代码(如 GPIO 初始化、时钟配置等…

张小明 2026/1/1 15:02:47 网站建设

自己的网站如何让百度收录购买了网站空间如何进入

Linly-Talker在跨境电商独立站的产品讲解自动化 在跨境电商的战场上,每一个点击都来之不易。独立站运营者常常面临这样的困境:花了重金投放广告,用户进来了,却在三秒内跳出——因为产品介绍还是冷冰冰的文字和图片,缺乏…

张小明 2025/12/21 23:37:23 网站建设