对事件使用对象类型而不是实际类型的原因是什么?

问题描述:

我谈论事件共同特征:对事件使用对象类型而不是实际类型的原因是什么?

Event (object, args); 

,为什么不:

Event (ImageProcessor, args); 

是#1导致性能成本太高,与正在沿着不清?

我认为这是因为历史原因混合避免代码重复。

在.Net 1.0中没有泛型,因此对于每种可能引发事件的类型,您都*定义事件处理程序委托。 像:

public delegate void TextBoxEventHandler(TextBox sender, EventArgs e); 
public delegate void ComboBoxEventHandler(ComboBox sender, EventArgs e); 

的所以取而代之,freamework开发人员创建一个

public delegate void EventHandler(object sender, EventArgs e); 

和用于铸造/作为运算符。

从.net 2.0,我们有仿制药,所以你可以这样

public delegate void EventHandler<TSender, TEventArgs>(TSender sender, TEventArgs e) where TEventArgs: EventArgs; 

甚至

public delegate void EventHandler<TSender, TEventArgs>(TSender sender, TEventArgs e); 

定义一次,然后使用这个样子。

public event EventHandler<TextBox, string> TextChanged; 
public event EventHandler<ComboBox, EventArgs> SomeComboBoxEvent; 

但是,这将打破为.Net 1.0/1.1编写的所有应用程序,所以框架开发人员将它放在原样。现在每个人都在使用这些预先通用的类。

另外我不确定如果Windows窗体设计器可以hadle泛型EventHandler。我从来没有试过去测试它。

在我看来,键入(通用)事件比这个标准更好。所以尽可能地使用它。

因为一个事件可以由多个不同的对象/类型引发,所以在编译时可能不知道类型。

+0

谢谢乔尔。你是指不同类型使用的相同事件?我以为他们会有自己的独立事件? – 2009-06-10 21:41:32

+1

主要是,相同的委托类型“事件”可以反复重复使用。你也可以在任何地方举办一个类型的公共活动,通过任何发件人,但这不太常见。 – 2009-06-10 21:46:29