C# 在DDLCooserReport_函数(ASP.net)中,参数Object o和EventArgs ea的用途是什么?

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参数传播。。。虽然当

我很好奇ASP中此方法签名的用途:

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或其子类

这不会改变您仍然必须保留正常签名的事实,但它可能会使执行更快