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

C# event的使用

在C#中,事件(Event)是一种特殊的成员,它允许类或对象以类型安全的方式向外界发出通知,表明某个特定的行为或状态变化已经发生。

订阅该事件的其他类可以定义处理方法来响应这些通知。

事件主要基于委托机制实现,是C#编程中实现观察者模式和发布-订阅模型的关键部分。

以下是如何在C#中声明、引发(raise)和订阅事件的基本步骤:

 

声明事件

首先,你需要定义一个委托类型,这个委托类型对应事件处理方法的签名。然后使用event关键字声明事件。

public delegate void MyEventHandler(object sender, EventArgs e); // 声明一个委托类型

public class PublisherClass
{
    public event MyEventHandler MyEvent; // 声明一个事件
}

 

订阅事件

在订阅者类中,你可以通过.+=操作符来添加一个事件处理方法到事件的订阅列表中。

public class SubscriberClass
{
    private PublisherClass publisher;

    public SubscriberClass(PublisherClass p)
    {
        publisher = p;
        publisher.MyEvent += OnMyEvent; // 订阅事件
    }

    private void OnMyEvent(object sender, EventArgs e)
    {
        Console.WriteLine("Event has been raised by " + sender.ToString());
        // 这里执行事件处理逻辑
    }
}

 

触发事件

在发布者类内部,当特定条件满足时,可以通过调用事件的.Invoke()方法来触发事件。

public class PublisherClass
{
    // ...

    public void DoSomething()
    {
        // 当需要触发事件时
        OnMyEvent?.Invoke(this, EventArgs.Empty);
    }

    protected virtual void OnMyEvent(EventArgs e)
    {
        MyEvent?.Invoke(this, e); // 安全地引发事件,防止null引用异常
    }
}

 

移除事件订阅

通过.-=操作符可以取消对事件的订阅。

public class SubscriberClass
{
    // ...
    
    ~SubscriberClass() // 或在适当的时候解除订阅
    {
        publisher.MyEvent -= OnMyEvent; // 取消订阅事件
    }
}

 

注意点

  • 使用?.Invoke()是为了避免在没有订阅者的情况下尝试调用事件导致的NullReferenceException。
  • OnMyEvent是一个保护的虚方法,通常用于在类内部引发事件,子类可以根据需要重写此方法。
  • 事件名称通常以On开头,例如OnButtonClick,遵循C#的命名规范。
  • 事件参数通常是EventArgs或其派生类,包含与事件相关的信息。
  • 事件只能使用+=操作符来订阅,使用-=操作符来取消订阅。这确保了事件的封装性,即外部代码不能直接调用事件。
  • 事件内部通常使用受保护的虚拟方法(如OnMyEvent)来触发事件,这样派生类可以重写事件触发逻辑。
  • 事件的类型通常是委托类型,它定义了可以订阅事件的方法的签名。
  • 自定义的事件参数类(如MyEventArgs)通常继承自EventArgs类,并包含与事件相关的数据。

 

 


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

相关文章:

  • [Computer Vision]实验三:图像拼接
  • U3D的.Net学习
  • linux下springboot项目nohup日志或tomcat日志切割处理方案
  • qiankun+vite+vue3
  • C语言——文件操作
  • 第二十四课 Vue中子组件调用父组件数据
  • WEB前端作业一
  • Linux - tmux命令
  • 高性能计算——流水线的危害
  • 封装Axios
  • MySQL的启停登陆与退出
  • Ubuntu系统Psi4 使用conda安装及编译安装
  • 前端基础——HTML傻瓜式入门(2)
  • 使用verilog编写一个猜数游戏设计及其testbench
  • vue框架渲染原理
  • 软考78-上午题-【面向对象技术3-设计模式】-结构型设计模式01
  • 进程学习--02
  • Vue2前端权限控制实战
  • reverse_iterator实现
  • cesium.js加载模型后,重新设置旋转角度属性值
  • 管理类联考–复试–英文面试–问题--规划介绍原因做法
  • FFmpeg查看所有支持的编码/解码器/封装/解封装/媒体格式/滤镜
  • Wireshark抓包工具的使用
  • 【PyTorch】基础学习:一文详细介绍 torch.save() 的用法和应用
  • Dockerfile 语法详解
  • 免费开源软件:思通数科舆情系统应对社会热点事件