• 学懂C#编程:常用高级技术——委托(Delegate)应用场景——事件处理


    事件处理: 委托是C#事件模型的核心。一个事件本质上是一个委托类型的字段,用于存储一系列方法的引用,当特定事件发生时,这些方法会被调用。

            我们通过下面这个例子来讲解C#中事件(Event)的基本用法,通过Publisher类发布事件,Subscriber类订阅并处理这个事件。下面我用更直白的语言解释这个过程:

    Publisher 类

            想象一下,Publisher(发布者)就像是一个广播站,它可以发出某种信号或者说“事件”。在这个例子中,它有一个名为EventHappened的事件,这个事件的类型是EventHandler。你可以认为EventHandler是一种特殊的委托类型,它连接了事件触发的地方和事件响应的地方。当事件触发时,所有订阅了这个事件的人都会得到通知。

    1. public class Publisher
    2. {
    3. // 声明一个事件,类型是 EventHandler,它是一个委托类型,用于接收发送者对象和事件参数
    4. public event EventHandler EventHappened;
    5. // 这个方法用于触发事件,即告诉所有订阅者:“事件发生了!”
    6. public void RaiseEvent()
    7. {
    8. // 使用?.运算符来安全地调用事件,如果没有人订阅,也不会抛出异常
    9. EventHappened?.Invoke(this, EventArgs.Empty);
    10. // this 表示事件发生的源头,EventArgs.Empty 是默认的事件参数,通常用于表示事件发生,但没有携带额外信息
    11. }
    12. }

    Subscriber 类

    Subscriber(订阅者)就像是收音机,它对特定的广播(事件)感兴趣。在构造函数中,Subscriber订阅了来自PublisherEventHappened事件,并指定了当这个事件发生时应该执行的方法OnEvent

    1. public class Subscriber
    2. {
    3. // 构造函数中,订阅Publisher的EventHappened事件
    4. public Subscriber(Publisher pub)
    5. {
    6. // += 操作符用于订阅事件,OnEvent 是事件触发时执行的方法
    7. pub.EventHappened += OnEvent;
    8. }
    9. // 这是事件处理方法,当EventHappened事件被Publisher触发时,这个方法就会被执行
    10. private void OnEvent(object sender, EventArgs e)
    11. {
    12. // 打印一条消息,表明事件已被处理
    13. Console.WriteLine("Event handled.");
    14. }
    15. }

    整体流程

    1. 创建一个Publisher实例,它是事件的源头。
    2. 创建一个或多个Subscriber实例,并将它们与Publisher关联起来。这个关联过程就是订阅事件,通过在Subscriber的构造函数中向Publisher的事件添加事件处理程序(OnEvent方法)来实现。
    3. Publisher通过调用RaiseEvent方法“广播”事件时,所有订阅了这个事件的Subscriber实例都会接收到通知,并执行它们各自定义的OnEvent方法,完成事件的处理。

            简而言之,事件机制让对象能够通知其他对象“某件事发生了”,而不用直接调用那些对象的方法,增强了代码的解耦和灵活性。

  • 相关阅读:
    vant-list上滑加载,数据重复,加载后返回顶部
    使用Pytorch从零实现Vision Transformer
    计算机毕业设计(附源码)python新生报到管理系统
    深入理解计算机系统——Midterm Exam 2012
    Java swing(GUI) mysql实现的进销存管理系统源码+运行教程+文档
    Android 内存优化&内存泄漏处理
    【云计算】云数据中心网络(七):负载均衡
    MQ系列16:MQ实现消息过滤处理
    vector向量类使用
    【Pytorch】torch.Tensor.view()
  • 原文地址:https://blog.csdn.net/martian665/article/details/139837974