ddlHooseReport_Function(ASP.net)中参数Object o和EventArgs ea的目的是



我很好奇这个方法签名在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框架指南。有些事件使用参数(如文件观察程序),有些则不使用(如您的情况)。

最新更新