我很好奇这个方法签名在 ASP 中的用途:
protected void ddlChooseReport_Function(Object sender, EventArgs e)
因为在之后的方法体中,它从未提及任何一个参数
方法签名必须兼容EventHandler
才能连接为事件的事件处理程序。这有点像实现一个接口。
仅仅因为特定的实现没有碰巧使用它们并不意味着它们没有用。例如,您可以使用相同的事件处理程序来连接许多控件的事件,并使用参数区分它们sender
- 并且可以通过e
参数传播有关事件的其他信息......虽然当它只是 时EventArgs
,没有可以传播的东西要多得多。
.NET 中的事件处理程序委托类型通常(不是特定于 ASP.NET)遵循使用Object sender
作为第一个参数的模式,这意味着负责事件发生的对象。第二个参数是 ofEventArgs
或子类(例如KeyEventArgs
)以提供更多信息。EventArgs
尽管在某些事件处理程序委托类型中拥有(几乎不包含任何信息)有点奇怪,但这确实意味着您可以注册一个“通用”事件处理程序,它可以处理任何符合该模式的事件。
(WPF 中的路由事件略有不同,IIRC,但您应该单独阅读这些内容。)
我正在阅读的一本书(C# 5.0 In A Nutshell)解决了这个问题。虽然方法签名没有变化,但它EventArgs.Empty
在实际调用委托时使用了它,并省略了 EventHandler 使用的类型的指定。
public class Stock
{
string symbol;
decimal price;
// constructor
public Stock (string symbol) { this.symbol = symbol; }
public event EventHandler PriceChanged;
protected virtual void OnPriceChanged
{
if (PriceChanged != null) PriceChanged(this, e);
}
public decimal Price
{
get { return price; }
set
{
if (price == value) return;
price = value;
OnPriceChanged(EventArgs.Empty);
}
}
}
通过这样做,您只是引发了事件,而忽略了有关事件的任何信息,并且它避免了不必要地实例化实例或 EventArgs 或其子类。
这不会改变您仍然必须保留正常签名的事实,但它可能会使执行更快。
这是关于事件方法签名应该是什么样子的整体 .Net 框架指南。有些事件使用参数(如文件观察器),有些则不使用(如您的情况)。