如果事件不生成数据,为什么要使用泛型参数替换EventArgs?

时间:2013-02-17 03:17:41

标签: c# events generics delegates event-handling

我很难理解来自MSDN EventHandler Delegate的以下短语:

  • “如果您的活动未生成活动数据,请将EventArgs替换为通用类型参数; ...”

我是否正确理解事件生成的数据存储在EventArgs的实例中?

附带好奇心:
这句话是否意味着如果事件生成数据,那么不使用泛型类型EventArgs?为什么?

主要问题是:
如果事件不生成数据,为什么要关注EventArgs(使其成为通用或保持非泛型)?

更新
从上面提到的文章和随附的代码示例中,我理解了代替委托:

public delegate void EventHandler(Object sender, EventArgs e)

我要用

public delegate void EventHandler<EventArgs>(Object sender, EventArgs e)   

当我的活动没有生成数据时。

2 个答案:

答案 0 :(得分:1)

如果你只是使用EventArgs,第二个就没有优势。文档可能只是没有提到第二种可能性,因为在所有示例中使用泛型参数显示单个委托定义更容易。

此外,通常会传递EventArgs.Empty而不是null

如果事件确实有数据,则需要继承EventArgs,然后使用该子类(在他们使用MyEventArgs的示例中)。 EventArgs本身没有保存数据的属性。

答案 1 :(得分:0)

从代码中,通用类型参数受EventArgswhere TEventArgs : EventArgs)约束。这意味着这是EventHandler delgate支持的最基本类型。

调用事件处理程序时,您是否可以发送null而不是EventArgs个实例?

至于为什么,我不确定为什么他们要求所有事件都有参数,当时似乎是个好主意。

他们需要EventArgs的一个原因是(在通用之前)EventHandler委托需要EventArgs,因此可能是为了保持兼容性。