ddlHooseReport_Function(ASP.net)中参数Object o和EventArgs ea的目的是
本文关键字:EventArgs ea Object 参数 Function ASP net ddlHooseReport | 更新日期: 2023-09-27 17:59:03
我很好奇这个方法签名在ASP:中的用途
protected void ddlChooseReport_Function(Object sender, EventArgs e)
因为在之后的方法体中,它从未提及任何一个参数
方法签名必须与EventHandler
兼容,才能将连接为事件的事件处理程序。这有点像实现一个接口。
仅仅因为特定的实现没有碰巧使用它们并不意味着它们是无用的。例如,您可以使用相同的事件处理程序来连接许多控件的事件,并使用sender
参数来区分它们,有关事件的其他信息可以通过e
参数传播。。。尽管当它只是EventArgs
时,可以传播的就不多了。
中的事件处理程序委托类型。NET通常(并非特定于ASP.NET)遵循使用Object sender
作为第一个参数的模式,即负责事件发生的对象。第二个参数是EventArgs
或子类(例如KeyEventArgs
),以提供更多信息。虽然在某些事件处理程序委托类型中有EventArgs
(几乎不包含任何信息)有点奇怪,但这确实意味着您可以注册一个"通用"事件处理程序,它可以处理符合模式的任何事件。
(IIRC,WPF中的路由事件略有不同,但您应该单独阅读这些事件。)
我正在读的一本书(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框架指南。有些事件使用参数(如文件观察程序),有些则不使用(如您的情况)。