• 学懂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方法,完成事件的处理。

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

  • 相关阅读:
    MySQL 基本语法讲解及示例(上)
    二分查找一个数首次与最后出现的位置
    【Vuex+ElementUI】Vuex中取值存值以及异步加载的使用
    深度学习——特征点检测和目标检测
    TCP MIN_RTO 辩证考
    糖尿病患者,稳定控糖,饮食上需注意什么?禁忌和适宜一次说清
    Pod 生命周期、重启策略、健康检查、服务可用性检查
    逆向大漠插件/用VB6.0实现后台鼠标移动和后台鼠标左键点击
    国庆day4
    mysql 5.7 修改密码
  • 原文地址:https://blog.csdn.net/martian665/article/details/139837974