我说的是事件的共同签名:
Event ( object, args );
为什么不:
Event ( ImageProcessor, args );
#1是否会产生性能成本,同时还不清楚?
答案 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。我从未尝试过测试它。
在我看来,类型(通用)事件比这个标准更好。所以尽可能使用它。