[英]What is the purpose of the arguments Object o and EventArgs ea, in ddlChooseReport_Function (ASP.net)?
我对这种方法签名在ASP中的用途感到好奇:
protected void ddlChooseReport_Function(Object sender, EventArgs e)
因为在之后的方法主体中,它从不提及任何一个参数
方法签名必须与EventHandler
兼容,以便将其连接为事件的事件处理程序。 有点像实现接口。
仅仅因为特定的实现不会碰巧使用它们,并不意味着它们没有用。 例如,您可以使用相同的事件处理程序为许多控件关联事件,并使用sender
参数对其进行区分-并且有关事件的其他信息可以通过e
参数传播...尽管当它只是EventArgs
,没有什么可以传播的。
通常 ,.NET(并非特定于ASP.NET)中的事件处理程序委托类型遵循使用Object sender
作为第一个参数的模式,这意味着负责事件发生的对象。 第二个参数可以是EventArgs
或子类(例如KeyEventArgs
)以提供更多信息。 尽管在某些事件处理程序委托类型中具有EventArgs
(几乎不包含任何信息)有点奇怪,但这确实意味着您可以注册一个“通用”事件处理程序,该事件处理程序可以处理符合该模式的任何事件。
(WIRC中的WPF路由事件略有不同,IIRC,但您应单独阅读这些事件。)
我正在阅读的一本书(简而言之C#5.0)解决了这个问题。 尽管方法签名没有变化,但它在实际调用委托时使用了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框架指南。 有些事件使用参数(例如文件监视程序),有些则不使用(例如您的情况)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.