Eventargs详解

一、概念

EventArgs是.net框架中的一个基类,是所有事件参数类的父类。当事件被触发时,事件处理程序接收到一个包含事件数据的对象,这个事件数据所在的类就是Args的一个子类。

public class EventArgs {     public static readonly EventArgs Empty = new EventArgs();     public EventArgs() { } }

从上面的代码可以看出,EventArgs并没有包含太多的内容,旨在为派生类提供一个基础。

二、事件处理

在c#中,如果我们想要自定义事件,我们必须先定义一个委托类型,然后使用关键字event声明一个事件并绑定上刚才定义的委托类型。下面给出一个简单的例子。

定义委托类型:

public delegate void EventHandler(object sender, EventArgs e);

定义事件:

public class MyClass {    public event EventHandler MyEvent;}

在上面的代码中,通过event关键字声明了一个名为MyEvent的事件,类型为EventHandler,该事件在MyClass中被引发。

那么在事件的触发过程中,EventHandler对参数的传递使用了EventArgs作为基础类。在事件触发时,可以向事件处理程序传递EventArgs或其派生类的对象,以便提供与事件相关的数据。示例如下:

public class MyEventArgs: EventArgs {    public int Value { get; set; }}public class MyClass {    public event EventHandler<MyEventArgs> MyEvent;    public void RaiseEvent() {        var args = new MyEventArgs { Value = 42 };        MyEvent?.Invoke(this, args);    }}public class Program {    private static void Main(string[] args) {        var myClass = new MyClass();        myClass.MyEvent += MyClass_MyEvent;        myClass.RaiseEvent();    }    private static void MyClass_MyEvent(object sender, MyEventArgs e) {        Console.WriteLine($"MyEvent handled! The value is {e.Value}.");    }}// 输出:// MyEvent handled! The value is 42.

在上面的代码中,MyClass类中定义了MyEvent,这个事件使用了泛型委托类型,并使用了自定义的派生类MyEventArgs。事件被触发时,生成了一个新的MyEventArgs对象并将其传递给处理程序,从而可以在事件处理程序中访问该事件的data(Value属性)。MyClass类的RaiseEvent()方法通过调用MyEvent.Invoke()方法来触发该事件。

三、实际使用

EventArgs最常见的用法是作为一些标准事件如Button.Click和KeyPress的参数。当控件上发生了这样的事件时,系统会将一个包含事件数据的EventArgs对象,以及控件的引用,传递给注册的事件处理程序。

下面给出一个自定义事件的例子,该事件用于通知观察者在账户余额发生变化时更新UI。如果你有一个基于事件的账户对象,你可能想要添加一个事件,以使UI在余额变化时能够及时匹配。在这样的情况下,EventArgs类无法满足我们的需求,我们需要自定义一个类来存储有关余额变更的数据,如下:

public class AccountEventArgs : EventArgs {    public decimal Balance { get; set; } // 新的账户余额    public AccountEventArgs(decimal balance) {        Balance = balance;    }}public class Account {    private decimal _balance;    public EventHandler<AccountEventArgs> OnBalanceChanged;    public decimal Balance {        get => _balance;        set {            _balance = value;            OnBalanceChanged?.Invoke(this, new AccountEventArgs(_balance));        }    }}public class Program {    private static void Main(string[] args) {        var account = new Account { Balance = 100 };        account.OnBalanceChanged += Account_OnBalanceChanged;        account.Balance -= 50;        account.Balance += 200;    }    private static void Account_OnBalanceChanged(object sender, AccountEventArgs e) {        Console.WriteLine($"The balance changed to {e.Balance}");    }}// 输出:// The balance changed to 50// The balance changed to 250

在上面的代码中,Account在setter中触发了OnBalanceChanged事件,该事件使用AccountEventArgs类来传递余额数据。在Main方法中,我们在account对象上注册Account_OnBalanceChanged方法来处理OnBalanceChanged事件。随着balance的减去50和增加200,Account_OnBalanceChanged被调用来处理这些变化,并输出消息。

四、结论

EventArgs提供了一种在触发事件时传递数据的方法,被广泛应用于各种类型的事件中。此外,自定义EventArgs子类可用于定义特定事件的数据,以便于事件处理程序可以访问事件的特定内容。对于需要自定义事件的程序员来说,熟悉EventArgs的使用使得更加容易地实现事件。

原创文章,作者:QELYG,如若转载,请注明出处:https://www.506064.com/n/369433.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
QELYGQELYG
上一篇 2025-04-12 13:01
下一篇 2025-04-12 13:01

相关推荐

  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25
  • MPU6050工作原理详解

    一、什么是MPU6050 MPU6050是一种六轴惯性传感器,能够同时测量加速度和角速度。它由三个传感器组成:一个三轴加速度计和一个三轴陀螺仪。这个组合提供了非常精细的姿态解算,其…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25
  • C语言贪吃蛇详解

    一、数据结构和算法 C语言贪吃蛇主要运用了以下数据结构和算法: 1. 链表 typedef struct body { int x; int y; struct body *nex…

    编程 2025-04-25
  • Python安装OS库详解

    一、OS简介 OS库是Python标准库的一部分,它提供了跨平台的操作系统功能,使得Python可以进行文件操作、进程管理、环境变量读取等系统级操作。 OS库中包含了大量的文件和目…

    编程 2025-04-25
  • Java BigDecimal 精度详解

    一、基础概念 Java BigDecimal 是一个用于高精度计算的类。普通的 double 或 float 类型只能精确表示有限的数字,而对于需要高精度计算的场景,BigDeci…

    编程 2025-04-25

发表回复

登录后才能评论