经典的一般C#事件具有以下参数:
(object sender, EventArgs e)
我可以为e
参数实现一个具有更具体签名的事件,派生EventArgs
。
现在,像EventArgs
这样的基类的目的是什么?我的意思是......它是空的。没有基础/抽象/虚拟属性,也没有字段或其他东西。
为什么基本事件的参数不像下面那样?
(object sender, object eventArgs)
也就是说,为什么所有带有一些已实现和特定的event-args参数的事件都是从EventArgs
而不是从简单的object
派生出来的?
上述问题与以下问题相对应。通用表单中的事件委托是:
delegate void EventHandler<TEventArgs>(object sender, TEventArgs e)
并且对参数e
没有任何限制。但我希望像where TEventArgs : EventArgs
这样的东西能够连贯......
答案 0 :(得分:6)
对象不会排除诸如int,double等值类型。这会引入boxing and un-boxing issues。在对象上使用基类的选择是强制在整个API中传递强类型对象的选择。
当我看到普遍使用object type时,我倾向于畏缩,因为它有点击败了使用强类型编程语言的全部意义,你可能会在javascript中编程,尽管任何人都熟悉javascript会知道他们正在努力争取strongly typed programming paradigm。
编辑:详细说明通过reference types vs value types的事件模型之间的区别。当处理事件的代理人改变事件的数据时,许多人在提交事件时经常会这样做,如果传递的数据是值类型,那么您需要开始考虑是否要更改按值传递的副本或原始引用的值类型,当然你希望你改变原来的。在.NET事件模型中强制传递引用类型是一个非常关键的设计决策。