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

时间:2009-06-10 21:35:30

标签: c# .net events

我说的是事件的共同签名:

Event ( object, args );

为什么不:

Event ( ImageProcessor, args );

#1是否会产生性能成本,同时还不清楚?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

在.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窗体设计器是否可以使用通用的EventHandler。我从未尝试过测试它。

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