C# 在DDLCooserReport_函数(ASP.net)中,参数Object o和EventArgs ea的用途是什么?
我很好奇ASP中此方法签名的用途:C# 在DDLCooserReport_函数(ASP.net)中,参数Object o和EventArgs ea的用途是什么?,c#,asp.net,C#,Asp.net,我很好奇ASP中此方法签名的用途: protected void ddlChooseReport_Function(Object sender, EventArgs e) 因为在随后的方法体中,它从不提及任何参数方法签名必须与EventHandler兼容,才能连接为事件的事件处理程序。这有点像实现一个接口 仅仅因为特定的实现没有使用它们并不意味着它们是无用的。例如,您可以使用同一个事件处理程序为许多控件连接事件,并使用sender参数区分它们,有关事件的其他信息可以通过e参数传播。。。虽然当
protected void ddlChooseReport_Function(Object sender, EventArgs e)
因为在随后的方法体中,它从不提及任何参数方法签名必须与
EventHandler
兼容,才能连接为事件的事件处理程序。这有点像实现一个接口
仅仅因为特定的实现没有使用它们并不意味着它们是无用的。例如,您可以使用同一个事件处理程序为许多控件连接事件,并使用sender
参数区分它们,有关事件的其他信息可以通过e
参数传播。。。虽然当它只是EventArgs
时,可以传播的内容就不多了
NET中的事件处理程序委托类型通常(不特定于ASP.NET)遵循一种模式,即使用Object sender
作为第一个参数,这意味着负责事件发生的对象。第二个参数是提供更多信息的EventArgs
或子类(例如KeyEventArgs
)。尽管在某些事件处理程序委托类型中使用EventArgs
(其中几乎不包含任何信息)有点奇怪,但这确实意味着您可以注册一个“通用”事件处理程序,它可以处理符合该模式的任何事件
(IIRC,WPF中的路由事件略有不同,但您应该分别阅读它们。)这是关于事件方法签名外观的总体.Net framework指南。有些事件使用参数(如文件查看器),有些则不使用参数(如您的情况)。我正在阅读的一本书(简而言之是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或其子类
这不会改变您仍然必须保留正常签名的事实,但它可能会使执行更快