跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C Sharp 事件触发
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C#事件触发 = == 介绍 == 在C#中,'''事件触发'''是面向对象编程的核心机制之一,允许对象在特定动作发生时通知其他对象。事件基于'''发布-订阅模式''',其中: * '''发布者(Publisher)''':包含事件定义并触发事件的对象。 * '''订阅者(Subscriber)''':通过事件处理器(Event Handler)响应事件的对象。 事件常用于用户界面交互(如按钮点击)、异步编程和组件间通信。 == 事件基础 == === 事件声明 === 事件需使用{{mono|event}}关键字声明,并依赖委托类型。标准模式使用{{mono|EventHandler}}或自定义委托: <syntaxhighlight lang="csharp"> // 声明委托(若需自定义参数) public delegate void MyEventHandler(object sender, EventArgs e); // 在类中声明事件 public event MyEventHandler MyEvent; </syntaxhighlight> === 事件触发步骤 === 1. '''定义事件''':指定委托类型。 2. '''订阅事件''':使用{{mono|+=}}添加处理器。 3. '''触发事件''':通过{{mono|Invoke}}或简写{{mono|MyEvent?.Invoke()}}调用。 == 代码示例 == === 基础示例 === <syntaxhighlight lang="csharp"> using System; class Publisher { // 声明事件 public event EventHandler OnAction; public void DoAction() { Console.WriteLine("执行动作..."); // 触发事件 OnAction?.Invoke(this, EventArgs.Empty); } } class Subscriber { public void HandleEvent(object sender, EventArgs e) { Console.WriteLine("事件被触发!"); } } class Program { static void Main() { var publisher = new Publisher(); var subscriber = new Subscriber(); // 订阅事件 publisher.OnAction += subscriber.HandleEvent; // 触发事件 publisher.DoAction(); } } </syntaxhighlight> '''输出:''' <pre> 执行动作... 事件被触发! </pre> === 自定义事件参数 === 扩展{{mono|EventArgs}}传递数据: <syntaxhighlight lang="csharp"> public class CustomEventArgs : EventArgs { public string Message { get; set; } } class Publisher { public event EventHandler<CustomEventArgs> OnAction; public void DoAction() { OnAction?.Invoke(this, new CustomEventArgs { Message = "自定义数据" }); } } </syntaxhighlight> == 实际应用场景 == === 用户界面交互 === 在WinForms或WPF中,按钮点击事件是典型例子: <syntaxhighlight lang="csharp"> button.Click += (sender, e) => { MessageBox.Show("按钮被点击!"); }; </syntaxhighlight> === 观察者模式 === 实现松耦合组件通信: <mermaid> classDiagram class Subject { +event EventHandler Notify +DoWork() } class Observer { +HandleEvent() } Subject --> Observer : 触发事件 </mermaid> == 高级主题 == === 事件访问器 === 自定义事件的添加/移除逻辑: <syntaxhighlight lang="csharp"> private EventHandler _myEvent; public event EventHandler MyEvent { add { _myEvent += value; } remove { _myEvent -= value; } } </syntaxhighlight> === 线程安全触发 === 使用临时变量避免空引用异常: <syntaxhighlight lang="csharp"> var handler = OnAction; handler?.Invoke(this, EventArgs.Empty); </syntaxhighlight> == 常见问题 == * '''Q:事件与委托的区别?''' A:事件是委托的封装,仅允许类内部触发,外部只能订阅/取消订阅。 * '''Q:如何传递多个参数?''' A:继承{{mono|EventArgs}}并添加属性。 == 总结 == C#事件触发机制是实现组件间通信的关键技术,通过标准化的发布-订阅模式降低耦合度。掌握事件的定义、订阅、触发及参数传递,能够高效处理交互逻辑和异步任务。 [[Category:编程语言]] [[Category:C Sharp]] [[Category:C Sharp 属性与事件]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Ifsubst
(
编辑
)
模板:Mono
(
编辑
)
模板:Mono/styles.css
(
编辑
)