当前位置: 首页 > article >正文

C# 事件(Event)详解

C# 事件详解

事件(Event)是 C# 中的一种特殊类型的委托,它是基于委托的基础上构建的,用来实现事件驱动编程。在 C# 中,事件常用于处理用户输入、系统通知、数据更新等场景,允许一个对象通知其他对象某些行为已经发生。

1. 事件的基础概念

事件本质上是对委托的一种封装,提供了一种机制,使得类和对象能够通过事件通知外部发生了特定的行为。
• 委托:是对方法的引用。
• 事件:是对委托的一种封装,它提供了限制,确保只能通过特定的方式订阅和触发事件。

1.1 事件声明

事件的声明语法和委托类似,定义一个委托类型的事件。事件通常使用 event 关键字进行声明,之后可以将方法与该事件绑定。

public delegate void MyEventHandler(string message);  // 委托声明

public event MyEventHandler MyEvent;  // 事件声明

这里,MyEventHandler 是一个委托类型,MyEvent 是该类型的事件。

1.2 事件的订阅和触发

• 订阅:通过 += 运算符将方法与事件绑定。当事件触发时,所有绑定的方法会被执行。
• 触发:通过 Invoke 方法触发事件,通常由事件发布者调用。

2. 事件的基本使用

2.1 定义事件和触发事件

  1. 定义委托类型:声明事件的委托类型。
  2. 定义事件:使用 event 关键字声明事件。
  3. 触发事件:通过委托触发事件。
using System;

public delegate void MyEventHandler(string message);  // 声明委托类型

public class Publisher
{
    // 声明事件
    public event MyEventHandler MyEvent;

    // 触发事件的方法
    public void TriggerEvent()
    {
        MyEvent?.Invoke("Hello, event triggered!");  // 触发事件
    }
}

public class Subscriber
{
    // 事件处理方法
    public void OnEventTriggered(string message)
    {
        Console.WriteLine(message);
    }
}

public class Program
{
    public static void Main()
    {
        Publisher publisher = new Publisher();
        Subscriber subscriber = new Subscriber();

        // 订阅事件
        publisher.MyEvent += subscriber.OnEventTriggered;

        // 触发事件
        publisher.TriggerEvent();
    }
}

输出:

Hello, event triggered!

2.2 事件的多播

事件支持多播,即多个方法可以订阅同一个事件。当事件触发时,所有订阅的方法都会被依次调用。

public class Subscriber
{
    public void OnEventTriggered(string message)
    {
        Console.WriteLine("First subscriber: " + message);
    }

    public void OnAnotherEventTriggered(string message)
    {
        Console.WriteLine("Second subscriber: " + message);
    }
}

public class Program
{
    public static void Main()
    {
        Publisher publisher = new Publisher();
        Subscriber subscriber = new Subscriber();

        // 订阅多个方法
        publisher.MyEvent += subscriber.OnEventTriggered;
        publisher.MyEvent += subscriber.OnAnotherEventTriggered;

        // 触发事件
        publisher.TriggerEvent();
    }
}

输出:

First subscriber: Hello, event triggered!
Second subscriber: Hello, event triggered!

2.3 取消事件订阅

可以使用 -= 运算符取消事件的订阅。当取消订阅后,事件就不再触发已经取消的方法。

public class Program
{
    public static void Main()
    {
        Publisher publisher = new Publisher();
        Subscriber subscriber = new Subscriber();

        // 订阅事件
        publisher.MyEvent += subscriber.OnEventTriggered;
        publisher.MyEvent += subscriber.OnAnotherEventTriggered;

        // 触发事件
        publisher.TriggerEvent();

        // 取消订阅
        publisher.MyEvent -= subscriber.OnAnotherEventTriggered;

        // 触发事件
        publisher.TriggerEvent();
    }
}

输出:

First subscriber: Hello, event triggered!
Second subscriber: Hello, event triggered!
First subscriber: Hello, event triggered!

2.4 事件的封装

C# 中的事件通过 event 关键字对委托进行了封装,限制了对事件的直接调用。事件的封装使得外部代码无法直接触发事件,只能通过 += 和 -= 来订阅和取消订阅。

public class Publisher
{
    // 声明事件
    public event MyEventHandler MyEvent;

    // 触发事件的方法,仅在发布者类内部调用
    protected virtual void OnEventTriggered(string message)
    {
        MyEvent?.Invoke(message);
    }

    // 提供公共方法触发事件
    public void TriggerEvent()
    {
        OnEventTriggered("Event triggered in Publisher");
    }
}

通过 protected virtual 方法封装事件的触发逻辑,确保只有类的内部才能触发事件。

3. 事件的常见使用场景

3.1 事件驱动编程

事件通常用于事件驱动编程模型中,特别是GUI编程和异步编程。当用户进行某些操作(如点击按钮、输入数据等)时,事件就会被触发,通知其他对象作出反应。例如:
• 用户界面(UI):用户点击按钮、输入框等控件时,触发事件(如 Button.Click)。
• 数据更新:当数据发生变化时,通过事件通知其他部分进行更新。
• 异步操作:在异步操作完成时,触发事件通知处理结果。

3.2 实现“发布-订阅”模式

事件是实现“发布-订阅”模式的典型工具。在发布-订阅模式中,发布者对象触发事件,订阅者对象响应事件。事件使得发布者和订阅者之间的耦合度降低。发布者不知道订阅者的具体实现,只是通过事件通知订阅者。

3.3 异步编程和回调

在异步编程中,事件可用于在操作完成后通知调用者或其他部分的代码。典型场景包括:
• 异步网络请求
• 文件读写操作
• 数据库查询等
例如,您可以创建一个后台任务执行完毕后触发事件通知UI线程更新界面。

3.4 定制化的事件处理

C# 事件还可以用于定制化的通知和事件处理机制。例如,在复杂的业务逻辑中,当某些条件满足时,需要触发不同的事件处理逻辑。事件可以提供灵活的事件订阅机制,使得事件响应行为能够在运行时进行动态管理。

4. 事件与委托的区别

虽然事件和委托都与方法的引用有关,但它们有一些显著的区别:
在这里插入图片描述

5. 总结

• 事件是基于委托的,提供了一个更严格的方式来管理方法的调用,尤其适用于需要通知和异步操作的场景。
• 事件允许发布-订阅模式,使得多个对象能够订阅并响应特定的事件。
• 事件通过 event 关键字封装了委托的调用,使得事件的触发只能在发布者内部进行,避免了外部代码误用。
• 事件广泛应用于UI编程、异步任务、数据更新通知等场景。
在实际开发中,事件是实现事件驱动编程、回调机制和发布-订阅模式的核心工具,它帮助减少了代码之间的耦合度,并使得代码更加灵活。


http://www.kler.cn/a/511989.html

相关文章:

  • 2024年博客之星年度评选—创作影响力评审入围名单公布
  • 数据可视化大屏设计与实现
  • Web前端第一次作业
  • 论文阅读:CosAE Learnable Fourier Series for Image Restoration
  • QQ邮箱登录逆向
  • hydra破解密码
  • C++和OpenGL实现3D游戏编程【连载21】——父物体和子物体模式实现
  • PyTorch框架——基于WebUI:Gradio深度学习ShuffleNetv2神经网络蔬菜图像识别分类系统
  • 【深度学习】傅里叶变换
  • WPS不登录无法使用基本功能的解决方案
  • MySQL快速入门——库的操作
  • Golang学习笔记_28——工厂方法模式
  • Arcgis Pro安装完成后启动失败的解决办法
  • 亚马逊库存管理sql记录
  • JUnit单元测试
  • OpenAI进军实体机器人:GPT赋能的智能未来
  • 成就与远见:2024年技术与思维的升华
  • [Unity]【游戏开发】 脚本创建物体的实践与技巧
  • C语言--深入printf
  • 阿里云安装mikrotik7配置内网互通
  • 欧拉(Euler 22.03)安装安装proxysql
  • 解决Spring+Vue的跨域问题
  • 精选了几道MySQL的大厂面试题,被提问的几率很高!
  • JavaScript笔记APIs篇02——DOM事件
  • 【Maui】下拉框的实现,绑定键值对
  • 【HarmonyOS NAPI 深度探索12】创建你的第一个 HarmonyOS NAPI 模块