使用EventArgs/EventArgs <T>委托类型而不是...的事件的好处

flo*_*ode 5 c# events

我理解使用带签名的委托类型的事件的好处 delegate void delegate_name(object sender, EventArgs e)

a)但除了可以为我们节省一些打字这一事实之外,还有其他原因我们应该使用已定义的委托类型EventHandler/EventHandler<T>而不是使用签名声明我们自己的委托类型delegate void delegate_name(object sender, EventArgs e)吗?

b)我可以想到使用预定义委托类型的另外两个原因EventArgs/EventArgs<T>是:

  • 消费特定事件的人(比如说event EventHandler my_event)会立即知道如何使用该事件?

  • 也许一些流行的第三方方法接受作为参数EventHandler/ EventHandler<T>委托类型,因此如果我们的代码有可能使用这些第三方方法,我们应该使用预定义的委托EventHandler/Eventhandler<T>

谢谢

Dan*_*Tao 11

对我来说,这个问题有点奇怪.否则这样做会带来什么好处(定义与EventHandler<TEventArgs>某些类型完全匹配的委托类型TEventArgs)?

也就是说,我可以想到以"正常"的方式做到这一点至少有一个好处:某些API已经期望与EventHandler<TEventArgs>代表打交道; 例如,Rx Extensions包含一个如下所示的方法:

Observable.FromEvent<TEventArgs>(
    Action<EventHandler<TEventArgs>> addHandler,
    Action<EventHandler<TEventArgs>> removeHandler
);
Run Code Online (Sandbox Code Playgroud)

如果您定义了自己的委托,那么使用这样的方法 - 期望EventHandler<TEventArgs>委托 - 会变得比必要的更复杂,没有额外的好处(无论如何我都可以看到).


Han*_*ant 7

你忘记了一个重要的:

  • 有一天会保持你的代码的疯子会发现你住在哪里并伤害你.


STW*_*STW 5

你已经回答了自己的问题:

  • 用于维护约定的Syntactical Sugar(少写)
  • 互操作性(使用EventHandler类型,您可以轻松地集成来自其他库的事件

简而言之; 没有充分的理由不使用它,除非你被迫(这通常是因为人们没有意识到它,或者没有理解它).