繁体   English   中英

ddlChooseReport_Function(ASP.net)中的对象o和EventArgs ea的目的是什么?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM