新闻中心
C# 如何定义和触发事件_C# 事件定义与触发方法指南
事件基于委托,用于对象间通信。首先定义EventHandler或自定义EventArgs传递数据,通过event关键字声明事件,使用OnEventName模式触发,订阅用+=,取消用-=,注意检查null并及时取消订阅以防内存泄漏。

在 C# 中,事件(Event)是一种用于实现观察者模式的机制,常用于对象间通信,比如 UI 控件响应用户操作、服务状态变更通知等。合理定义和触发事件能让代码更灵活、解耦更好。
事件的基本定义
事件基于委托(Delegate),因此定义事件前需要先定义一个委托类型,或使用系统提供的通用委托如 EventHandler 或 EventHandler
以下是一个使用 EventHandler 定义事件的示例:
public class MyPublisher{
// 定义事件
public event EventHandler MyEvent;
// 触发事件的方法
protected virtual void OnMyEvent()
{
MyEvent?.Invoke(this, EventArgs.Empty);
}
// 模拟条件满足时触发事件
public void DoSomething()
{
// 执行某些逻辑
Console.WriteLine("执行操作...");
// 触发事件
OnMyEvent();
}
}
自定义事件参数
如果需要传递额外数据,可以继承 EventArgs 创建自定义参数类。
Whimsical
Whimsical推出的AI思维导图工具
182
查看详情
public class MyEventArgs : EventArgs{
public string Message { get; set; }
public MyEventArgs(string message)
{
Message = message;
}
}
然后在类中使用泛型事件:
public class MyPublisher{
public event EventHandler
protected virtual void OnCustomEvent(string msg)
{
CustomEvent?.Invoke(this, new MyEventArgs(msg));
}
public void TriggerCustomEvent()
{
OnCustomEvent("这是自定义消息");
}
}
订阅与取消订阅事件
其他类可以通过 += 订阅事件,用 -= 取消订阅。
class Program{
static void Main()
{
var publisher = new MyPublisher();
// 订阅事件
publisher.MyEvent += HandleMyEvent;
publisher.CustomEvent += HandleCustomEvent;
publisher.DoSomething();
publisher.TriggerCustomEvent();
// 取消订阅
publisher.MyEvent -= HandleMyEvent;
}
static void HandleMyEvent(object sender, EventArgs e)
{
Console.WriteLine("MyEvent 被触发");
}
static voi
d HandleCustomEvent(object sender, MyEventArgs e){
Console.WriteLine($"收到消息: {e.Message}");
}
}
注意事项与最佳实践
- 始终在触发事件前检查是否为 null,或使用 null 条件运算符 ?. 避免异常
- 将触发方法命名为 OnXXX 是 .NET 的命名惯例
- 使用 virtual 方法以便派生类可重写事件触发行为
- 记得在适当时机取消订阅,防止内存泄漏,尤其是在长时间存在的发布者中
- 优先使用 EventHandler 或 EventHandler
,而非自定义委托,除非有特殊需求
基本上就这些。掌握事件的定义、触发和处理方式,能帮助你写出更清晰、响应性更强的 C# 程序。
以上就是C# 如何定义和触发事件_C# 事件定义与触发方法指南的详细内容,更多请关注其它相关文章!
# 抽象类
# 松北区建设局网站
# 剪映营销推广视频哪里进
# 汉服店的营销推广
# 短视频推广与营销
# 高粱seo技巧
# 敦煌网站推广网站建设
# 营口企业seo优化优势
# 小红书营销推广的特点
# 东港网站推广包年优惠
# 海外硕博网站建设
# 长时间
# ai
# 有哪些
# 是一种
# 是在
# 这是
# 是一个
# 游戏开发
# 运算符
# 自定义
# gate
# .net
# c#
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
QQ邮箱网页版入口 QQ邮箱官方邮箱登录通道
windows10怎么关闭系统提示音_windows10彻底静音设置方法
Excel如何用迷你图显趋势_Excel用迷你图显趋势【趋势小图】
age动漫网站入口 age动漫官网直接访问入口
html5 app怎么运行环境_配html5 app运行环境【教程】
PySpark中高效提取字符串右侧可变长度数字:使用regexp_extract
qq游戏大厅官方下载_qq游戏免费下载安装入口
PySpark中从现有列右侧提取可变长度字符创建新列的教程
C++ typeid如何获取类型信息_C++ RTTI运行时类型识别用法
React项目中导航栏Logo自适应布局:避免裁剪与布局溢出
蛙漫安全无毒 官方认证的绿色入口
优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题
Go语言HTML解析:利用Goquery精准获取指定元素内容
Django表单验证失败时保留用户输入数据的最佳实践
夸克浏览器桌面版同步不了书签怎么处理 夸克浏览器跨设备同步异常解决方案
汽车之家官方网站官网入口_汽车之家网页版直接进入
J*aScript异步迭代器_j*ascript异步遍历
Django AJAX 文件上传教程:解决图片无法保存到模型的常见问题
印象笔记如何设提醒任务防漏执行_印象笔记设提醒任务防漏执行【任务提醒】
Animex动漫社网入口地址 Animex动漫社网正版在线入口
J*a递归快速排序中静态变量导致数据累积问题的解决方案
支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡
抓大鹅解压小游戏 抓大鹅摸鱼解压入口
Yandex官网免登录入口_俄罗斯Yandex搜索引擎一键访问
优化HTML表单样式:解决输入框焦点跳动与元素间距问题
c++中的std::forward_list和std::list有什么不同_c++ forward_list与list区别分析
AWS EC2实例间SQL Server连接超时:安全组配置与故障排除指南
如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率
Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略
抖音商城签到领现金是真的吗_抖音商城签到奖励与提现说明
AO3官方在线访问地址 Archive of Our Own最新镜像合集
j*a toString()的覆盖
机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等
c++20的std::jthread是什么_c++可中断线程与RAII式管理
在Typer应用中优雅地处理和重组任意命令行参数
Python自定义类排序:解决lambda键值访问TypeError的实践指南
c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换
Python字典中优雅地迭代剩余元素的方法
在J*a中如何在J*a中使用异常机制记录错误日志_异常日志实践经验
邮政快递包裹最新位置 邮政快递实时追踪入口
在J*a里如何理解依赖关系的方向_依赖方向在模块结构中的作用
邮政编码查询不到怎么办_邮政编码查询不到的常见原因与对策
Golang指针如何与map组合使用_Golang map指针组合实践
打开就能玩的植物大战僵尸 植物大战僵尸网页版传送门
抖音隐秘迷城小游戏入口_ 抖音冒险解谜小游戏秒玩
c++ dfs和bfs代码 c++深度广度优先搜索算法
J*aScript中针对特定容器内图片动画的实现教程
特斯拉自动驾驶房车计划曝光 原型车将于2027年亮相
解决Bootstrap卡片顶部边距导致背景图下移的问题
C++如何解决segmentation fault_C++段错误调试与原因分析


2025-11-15
浏览次数:次
返回列表