C Sharp 事件触发
外观
C#事件触发[编辑 | 编辑源代码]
介绍[编辑 | 编辑源代码]
在C#中,事件触发是面向对象编程的核心机制之一,允许对象在特定动作发生时通知其他对象。事件基于发布-订阅模式,其中:
- 发布者(Publisher):包含事件定义并触发事件的对象。
- 订阅者(Subscriber):通过事件处理器(Event Handler)响应事件的对象。
事件常用于用户界面交互(如按钮点击)、异步编程和组件间通信。
事件基础[编辑 | 编辑源代码]
事件声明[编辑 | 编辑源代码]
事件需使用event关键字声明,并依赖委托类型。标准模式使用EventHandler或自定义委托:
// 声明委托(若需自定义参数)
public delegate void MyEventHandler(object sender, EventArgs e);
// 在类中声明事件
public event MyEventHandler MyEvent;
事件触发步骤[编辑 | 编辑源代码]
1. 定义事件:指定委托类型。 2. 订阅事件:使用{{{1}}}添加处理器。 3. 触发事件:通过Invoke或简写MyEvent?.Invoke()调用。
代码示例[编辑 | 编辑源代码]
基础示例[编辑 | 编辑源代码]
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();
}
}
输出:
执行动作... 事件被触发!
自定义事件参数[编辑 | 编辑源代码]
扩展EventArgs传递数据:
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 = "自定义数据" });
}
}
实际应用场景[编辑 | 编辑源代码]
用户界面交互[编辑 | 编辑源代码]
在WinForms或WPF中,按钮点击事件是典型例子:
button.Click += (sender, e) =>
{
MessageBox.Show("按钮被点击!");
};
观察者模式[编辑 | 编辑源代码]
实现松耦合组件通信:
高级主题[编辑 | 编辑源代码]
事件访问器[编辑 | 编辑源代码]
自定义事件的添加/移除逻辑:
private EventHandler _myEvent;
public event EventHandler MyEvent
{
add { _myEvent += value; }
remove { _myEvent -= value; }
}
线程安全触发[编辑 | 编辑源代码]
使用临时变量避免空引用异常:
var handler = OnAction;
handler?.Invoke(this, EventArgs.Empty);
常见问题[编辑 | 编辑源代码]
- Q:事件与委托的区别?
A:事件是委托的封装,仅允许类内部触发,外部只能订阅/取消订阅。
- Q:如何传递多个参数?
A:继承EventArgs并添加属性。
总结[编辑 | 编辑源代码]
C#事件触发机制是实现组件间通信的关键技术,通过标准化的发布-订阅模式降低耦合度。掌握事件的定义、订阅、触发及参数传递,能够高效处理交互逻辑和异步任务。