跳转到内容

C Sharp 事件触发

来自代码酷
Admin留言 | 贡献2025年4月29日 (二) 18:40的版本 (Page creation by admin bot)

(差异) ←上一版本 | 已核准修订 (差异) | 最后版本 (差异) | 下一版本→ (差异)

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("按钮被点击!");
};

观察者模式[编辑 | 编辑源代码]

实现松耦合组件通信:

classDiagram class Subject { +event EventHandler Notify +DoWork() } class Observer { +HandleEvent() } Subject --> Observer : 触发事件

高级主题[编辑 | 编辑源代码]

事件访问器[编辑 | 编辑源代码]

自定义事件的添加/移除逻辑:

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#事件触发机制是实现组件间通信的关键技术,通过标准化的发布-订阅模式降低耦合度。掌握事件的定义、订阅、触发及参数传递,能够高效处理交互逻辑和异步任务。