EventArgs作用是什么?事件处理机制的基石!

吉云

今天跟大家唠唠我最近在项目里用 `eventargs` 的一些心得,这东西看着简单,用起来还是有些门道的。

我接到个需求,大概就是界面上一个按钮,点击后要触发一系列的操作,这些操作之间需要传递一些数据。最开始我啥也没想,直接用委托加事件,数据就直接塞到委托的参数里,简单粗暴。就像这样:

EventArgs作用是什么?事件处理机制的基石!

public event Action<string> MyEvent;

void OnButtonClick()

MyEvent?.Invoke("我是要传递的数据");

EventArgs作用是什么?事件处理机制的基石!

完事儿! 跑起来是没问题,但是很快问题就来。需求变更,需要传递的数据越来越多,类型也越来越复杂。委托的参数列表变得越来越长,简直没法看。而且如果不同的事件处理函数只需要其中的一部分数据,那其他的参数就显得非常冗余。

这时候,我就想起 `EventArgs` 这玩意儿。这东西是专门用来封装事件数据的,用起来也挺简单。我定义一个类,继承自 `EventArgs`,把所有需要传递的数据都放到这个类里面。


EventArgs作用是什么?事件处理机制的基石!

public class MyEventArgs : EventArgs

public string Message { get; set; }

public int Number { get; set; }

public bool Flag { get; set; }

EventArgs作用是什么?事件处理机制的基石!

然后,我修改事件的委托类型,使用 `EventHandler<MyEventArgs>`,这样事件处理函数就可以接收到 `MyEventArgs` 类型的参数。


public event EventHandler<MyEventArgs> MyEvent;

EventArgs作用是什么?事件处理机制的基石!

void OnButtonClick()

MyEvent?.Invoke(this, new MyEventArgs { Message = "我是消息", Number = 123, Flag = true });

EventArgs作用是什么?事件处理机制的基石!

这样一来,代码立马变得清晰多。事件处理函数可以根据自己的需要,从 `EventArgs` 中取出需要的数据,而不用关心其他的数据。而且如果以后需要添加新的数据,只需要在 `MyEventArgs` 类中添加新的属性就可以,不用修改委托的类型,也不用修改事件处理函数的签名。

用 `EventArgs` 之后,我的代码可读性大大提高。而且`EventArgs` 还可以配合 `sender` 参数一起使用,`sender` 参数表示事件的发送者,这样事件处理函数就可以知道是哪个对象触发事件。这在一些复杂的场景下非常有用。

`EventArgs` 也有一些需要注意的地方。比如,`EventArgs` 默认是按引用传递的,如果需要修改 `EventArgs` 中的数据,可能会影响到事件发送者。在某些情况下,可能需要使用 `struct` 来定义事件数据,这样可以保证数据的独立性。

`EventArgs` 是一个非常有用的工具,可以帮助我们更好地组织事件数据,提高代码的可读性和可维护性。如果你还在为事件数据的传递而烦恼,不妨试试 `EventArgs`,说不定能给你带来惊喜。

总结一下我的实践步骤:

    EventArgs作用是什么?事件处理机制的基石!

  • 第一步:定义一个类,继承自 `EventArgs`,用于封装事件数据。
  • 第二步:在类中添加需要的属性,用于存储事件数据。
  • 第三步:修改事件的委托类型,使用 `EventHandler<你的EventArgs类型>`。
  • 第四步:在触发事件的时候,创建 `EventArgs` 实例,并填充数据。
  • 第五步:在事件处理函数中,从 `EventArgs` 中取出需要的数据。

EventArgs作用是什么?事件处理机制的基石!

就这样,搞定!希望我的经验能帮到你!

免责声明:由于无法甄别是否为投稿用户创作以及文章的准确性,本站尊重并保护知识产权,根据《信息网络传播权保护条例》,如我们转载的作品侵犯了您的权利,请您通知我们,请将本侵权页面网址发送邮件到qingge@88.com,深感抱歉,我们会做删除处理。

目录[+]