简体   繁体   English

EventHandler 与 EventHandler<TEventArgs>

[英]EventHandler vs. EventHandler<TEventArgs>

According to the accepted answer here there is no difference, but in MSDN :根据这里接受的答案没有区别,但在MSDN 中

Typically, you do not have to declare a delegate for an event, because you can use either the EventHandler or the EventHandler<TEventArgs> delegate.通常,您不必为事件声明委托,因为您可以使用EventHandlerEventHandler<TEventArgs>委托。 You should declare a delegate only in rare scenarios, such as making your class available to legacy code that cannot use generics.您应该仅在极少数情况下声明委托,例如使您的类可用于不能使用泛型的遗留代码。

So it seems to me that Microsoft highly recommend the generic approach over the simplified and less typing one, but I cannot figure out why or what is the difference?所以在我看来,微软强烈推荐通用方法而不是简化和少打字的方法,但我不知道为什么或有什么区别?

I believe both the accepted answer and the MSDN documentation you link to state the same thing, to use either EventHandler or EventHandler<"T"> (the less typing one) instead of creating your own custom delegates.我相信接受的答案和您链接的 MSDN 文档都说明了同样的事情,使用 EventHandler 或 EventHandler<"T"> (较少输入)而不是创建您自己的自定义委托。

From the accepted answer: "...you should probably prefer the former over the latter because it's clearer and requires less typing."从接受的答案来看:“......你可能更喜欢前者而不是后者,因为它更清晰,需要更少的输入。”
The former being:前者是:

public event EventHandler<MyEventArgs> SomeEvent;

And from MSDN: For scenarios where the EventHandler and EventHandler<"TEventArgs"> delegates do not work, you can define a delegate.来自 MSDN:对于 EventHandler 和 EventHandler<"TEventArgs"> 委托不起作用的情况,您可以定义一个委托。
Defining a delegate is the 'latter' from the accepted answer:定义代表是已接受答案中的“后者”:

public delegate void MyEventHandler(object sender, MyEventArgs e);

In my opinion, as soon as EventHandler<MyEventArgs> occurs at least twice in your project, you have produced hard-to-maintain copy & paste code:在我看来,一旦EventHandler<MyEventArgs>在您的项目中至少出现两次,您就会生成难以维护的复制和粘贴代码:

public event EventHandler<MyEventArgs> ItemBeginningEdit;                ^
public event EventHandler<MyEventArgs> ItemCommited;                     |
public event EventHandler<MyEventArgs> ItemEditCancelled;                |
...

In order to keep your code clean, you should abstract the event handler type by defining your own MyEventHandler delegate in this case.为了保持代码干净,在这种情况下,您应该通过定义自己的MyEventHandler委托来抽象事件处理程序类型。 If you later want to switch from let's say MyEventArgs to MyEventArgs2 , you only have to change it in one single place:如果您以后想从MyEventArgs切换到MyEventArgs2 ,您只需在一个地方更改它:

public delegate void MyEventHandler(object sender, MyEventArgs2 e);
public event MyEventHandler ItemBeginningEdit;                ^
public event MyEventHandler ItemCommited;                     |
public event MyEventHandler ItemEditCancelled;                |
...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM