C#事件机制和event关键字
C#event的掌握应该首先区分事件机制和event关键字两者不要混为一谈一.事件机制概述事件机制的作用是降低模块间的耦合度本质是观察者模式的应用通过增加监听器使事件响应函数的调用分散在各个对象自身内部当增加和减少一个事件响应函数时只需要增加或删除相应对象内的代码降低了模块间的耦合度。参考关键字eventC# 参考二.事件机制的应用事件机制在游戏中广泛应用游戏中经常触发的事件有单点触摸事件多点触摸事件键盘事件鼠标事件各种自定义事件等。在MVC模式中对代码要求质量较高的项目会规定在model中收到消息后不允许直接调用view类的方法必须通过发送事件机制来间接调用。从广义上说事件机制是初级程序必须要掌握的技能。三.事件机制的要素事件名称发布者订阅者订阅者注册回调发布者派发事件订阅者回调执行event的实现基于委托的多播event是在委托类型变量前加上event关键字其本质是用来对委托类型的变量进行封装。event相当于增强了委托的封装性以保证委托类型的变量仅能在声明它的类中调用在类外部不能被直接调用。这样相当于无论是在类的内部声明public还是protected的委托类型变量只要用event进行封装其效果都相当于声明了一个私有的委托类型变量namespace Console0719 { //发布者 public class Publisher { // 和事件搭配的委托 public delegate void PubDelegate(); // 定义事件 public event PubDelegate PubEvent; // 编写处理事件的具体逻辑 public void PublishEvent() { if (PubEvent null) { Console.WriteLine(无订阅者); } else { // 执行注册的事件 PubEvent(); } } } // 订阅者 public class Subscriber { public string name { get; set; } public Subscriber(string s) { name s; } public void onEvent() { Console.WriteLine({0} onWork, name); } } class Program { static void Main(string[] args) { Publisher p new Publisher(); Subscriber s1 new Subscriber(s1); Subscriber s2 new Subscriber(s2); // 执行事件 p.PublishEvent(); // 注册事件 p.PubEvent new Publisher.PubDelegate(s1.onEvent); p.PubEvent new Publisher.PubDelegate(s2.onEvent); // 执行事件 p.PublishEvent(); } } }四.事件与委托的区别1.事件的实现基于委托的多播2.在注册和注销事件上委托可以使用和来将函数注册到委托的变量上使用-来将函数注销。而事件则有着更严格的限制事件只能使用来将函数注册到其上使用-来将函数注销。3.事件类型的委托变量(即用事件封装的委托类型变量)在外部不能直接当成其引用的函数来进行调用声明时加了event后直接调用会报错它在外部只能用于注册或注销函数而公有的委托类型在外部是可以直接用来调用对应的注册函数。五. 事件机制中用EventHandler委托委托是C#中实现事件机制的核心C#中提供了EventHandler预定义委托用于规范事件回调方法的写法。第一个参数sender引用派发事件的实例。第二个参数代表事件数据如果无事件数据则第二个参数是EventArgs.Empty否则第二个参数是EventArgs的子类public delegate void EventHandler(object? sender, EventArgs e);下面是一个使用EventHandler委托的Demousing System; using UnityEngine; using UnityEngine.UI; public class Subscriber { public void Subscribe(EventTest publisher) { publisher.mEventHandler OnClickEvent; Debug.Log(Subscriber: 订阅); } public void Unsubscribe(EventTest publisher) { publisher.mEventHandler - OnClickEvent; Debug.Log(Subscriber: 取消订阅); } private void OnClickEvent(object sender, EventArgs e) { Debug.Log(Subscriber: 收到点击事件, sender sender); } } public class EventTest : MonoBehaviour { private Button btn; public event EventHandler mEventHandler; private Subscriber mSubscriber; void Start() { btn GetComponentButton(); btn.onClick.AddListener(OnBtnClick); mSubscriber new Subscriber(); mSubscriber.Subscribe(this); } public void OnDestroy() { mSubscriber.Unsubscribe(this); } public void OnBtnClick() { if (mEventHandler ! null) { mEventHandler(this, EventArgs.Empty); } } }在EventTest类中用预定义委托EventHandler声明了事件mEventHandler并在OnBtnClick中调用事件。Subscriber中又和EventHandler相同签名的OnClickEventprivate void OnClickEvent(object sender, EventArgs e)并通过Subscribe订阅Unsubscribe取消六. 事件机制中用EventHandlerTEventArgs委托和EventHandler相比EventHandlerTEventArgs的区别在于可携带自定义数据。第二个参数是泛型TEventArgs。可传入继承EventArgs的类从而事件触发时向订阅者传递自定义数据。public delegate void EventHandlerin TEventArgs(object? sender, TEventArgs e) where TEventArgs : allows ref struct;using System; using UnityEngine; using UnityEngine.UI; public class ClickEventArgs : EventArgs { public string msg; public ClickEventArgs(string msg) { this.msg msg; } } public class Subscriber { public void Subscribe(EventTest publisher) { publisher.mEventHandler OnClickEvent; Debug.Log(Subscriber: 订阅); } public void Unsubscribe(EventTest publisher) { publisher.mEventHandler - OnClickEvent; Debug.Log(Subscriber: 取消订阅); } // 泛型事件回调EventHandlerClickEventArgs private void OnClickEvent(object sender, ClickEventArgs e) { Debug.Log(Subscriber: 收到点击事件, sender sender , msg e.msg); } } public class EventTest : MonoBehaviour { private Button btn; // EventHandlerTEventArgs携带自定义参数 public event EventHandlerClickEventArgs mEventHandler; private Subscriber mSubscriber; void Start() { btn GetComponentButton(); btn.onClick.AddListener(OnBtnClick); mSubscriber new Subscriber(); mSubscriber.Subscribe(this); } public void OnDestroy() { mSubscriber.Unsubscribe(this); } public void OnBtnClick() { if (mEventHandler ! null) { mEventHandler(this, new ClickEventArgs(button clicked)); } } }参考处理和引发事件参考引发和消费事件

相关新闻

深度学习调参实录:学习率0.001到0.0001的6小时血泪史与梯度诊断工具链

深度学习调参实录:学习率0.001到0.0001的6小时血泪史与梯度诊断工具链

深度学习训练中的学习率调优:从理论到实践的完整指南 昨晚11点,我的ResNet-50在SageMaker训练任务里第3次梯度爆炸时,终于意识到问题不在数据——学习率策略的微小差异能让loss曲线从平稳变成过山车。经过72小时的系统调试与验证,…

2026/8/4 20:03:00 阅读更多 →
Godot引擎安装与配置全攻略:从零开始搭建游戏开发环境

Godot引擎安装与配置全攻略:从零开始搭建游戏开发环境

1. 项目概述:为什么选择Godot作为你的游戏引擎?如果你正在寻找一个能让你从零开始、亲手打造游戏世界的工具,并且不希望被复杂的许可协议、高昂的费用或者臃肿的安装包吓退,那么Godot引擎几乎是为这个场景量身定做的。我最初接触G…

2026/8/4 20:01:59 阅读更多 →
5分钟掌握HTTrack:创建永久网站镜像的终极免费工具

5分钟掌握HTTrack:创建永久网站镜像的终极免费工具

5分钟掌握HTTrack:创建永久网站镜像的终极免费工具 【免费下载链接】httrack HTTrack Website Copier, copy websites to your computer (Official repository) 项目地址: https://gitcode.com/gh_mirrors/ht/httrack 你是否曾遇到过珍爱的网站突然消失的遗憾…

2026/8/4 20:01:59 阅读更多 →

最新新闻

一场由 Cursor Remote 引发的生产服务器卡死:从 I/O 阻塞到根因定位

一场由 Cursor Remote 引发的生产服务器卡死:从 I/O 阻塞到根因定位

这次事故最麻烦的地方,不是服务器卡死本身,而是它留下的表象几乎都指向磁盘。 生产服务器先后出现两次严重卡顿。故障发生时,接口超时、数据库连接失败、Docker 命令迟迟不返回,连 SSH 都很难登录。重启后所有服务又恢复正常&…

2026/8/4 20:34:11 阅读更多 →
绿的谐波们,望向万里之外的一家工厂

绿的谐波们,望向万里之外的一家工厂

导语:绿的谐波们的业绩,与马斯克能否兑现承诺息息相关。加州弗里蒙特与浙江杭州,两者的直线距离超一万公里。不过,在即将到来的具身智能时代,这两地极有可能会因一款产品而产生紧密的联动。目前,特斯拉弗里…

2026/8/4 20:34:11 阅读更多 →
AI 应用不是接个模型就完事:Java 后端必须补上的 8 个工程能力

AI 应用不是接个模型就完事:Java 后端必须补上的 8 个工程能力

摘要:模型调用只是入口,真正上线要补日志、Trace、权限、限流、降级、成本、评测和灰度。 这篇文章不按概念百科写,而是从 Java 后端和企业 AI 应用落地角度,拆清楚它解决的问题、真实场景、架构边界、代码建模、常见坑和上线检查…

2026/8/4 20:34:11 阅读更多 →
YOLOv11改进 | 主干/Backbone篇 | 大核心卷积UniRepLknet目标检测网络(适配yolov11全系列轻量化)

YOLOv11改进 | 主干/Backbone篇 | 大核心卷积UniRepLknet目标检测网络(适配yolov11全系列轻量化)

开始讲解之前推荐一下我的专栏,本专栏的内容支持(分类、检测、分割、追踪、关键点检测),专栏目前为限时折扣,欢迎大家订阅本专栏,本专栏每周更新3-5篇最新机制,更有包含我所有改进的文件和交流群提供给大家。 一、本文介绍 本文给大家带来的改进机制是特征提取网络UniRep…

2026/8/4 20:34:11 阅读更多 →
如何重塑设计体验:开源字体EB Garamond 12的终极应用指南

如何重塑设计体验:开源字体EB Garamond 12的终极应用指南

如何重塑设计体验:开源字体EB Garamond 12的终极应用指南 【免费下载链接】EBGaramond12 项目地址: https://gitcode.com/gh_mirrors/eb/EBGaramond12 探索古典印刷美学的现代重生,EB Garamond 12将16世纪的优雅带入数字时代。这款基于SIL开源字…

2026/8/4 20:34:11 阅读更多 →
学习日记47:Enhanced Contrastive Learning with Multi-view Longitudinal Data for Chest X-ray Report Gener

学习日记47:Enhanced Contrastive Learning with Multi-view Longitudinal Data for Chest X-ray Report Gener

摘要:大多数放射学报告自动生成法主要集中于单一或固定视角的图像来建模当前的疾病状况,这限制了诊断的准确性,并忽略了疾病的进展。尽管一些方法利用纵向数据来跟踪疾病进展,但它们仍然依赖于单张图像来分析当前的情况。本文提出…

2026/8/4 20:33:11 阅读更多 →

日新闻

AI Agent白手起家26: 使用标准事件驱动大模型实践

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要 练习目标:掌握大模型标准事件的调用回顾 LangChain 中的核心标准事件 invokestreambatchastream_eventswith_structured_output 环境准备实战代码:多种事件调用对比 同步调用与流式输出批量处理异步事件流监听结构化输出 运行说明与预期结果总结与扩…

2026/8/4 0:00:40 阅读更多 →
dealsea是什么?跨境卖家必知的美国deal站入门指南

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话,第一次听说美国这个老牌折扣网站的跨境卖家,十个有八个会问同一个问题:这个平台到底是干嘛的?我见过一个做家居出口的朋友,他在亚马逊上月销二十万美金,却从来没用过它。我给他看了首页——一屏一屏…

2026/8/4 0:01:40 阅读更多 →
清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

通讯作者:邓兵、刘建国通讯单位:清华大学DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清洁能源技术与电子器件不可或缺的核心原料,然而传统提取方式依赖能耗高、排放大的采矿与强…

2026/8/4 0:01:40 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/4 13:24:41 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/4 11:41:39 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/4 5:26:40 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/4 13:38:24 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/4 11:09:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/4 13:38:40 阅读更多 →