2

我很好奇这个方法签名在 ASP 中的用途:

protected void ddlChooseReport_Function(Object sender, EventArgs e) 

因为在之后的方法体中,它从未提及任何一个参数

4

3 回答 3

4

方法签名必须兼容EventHandler才能连接事件的事件处理程序。这有点像实现一个接口。

仅仅因为特定的实现没有碰巧使用它们并不意味着它们没有用。例如,您可以使用相同的事件处理程序来连接许多控件的事件,并使用参数区分它们sender- 并且可以通过e参数传播有关事件的其他信息......虽然当它只是 时EventArgs,没有可以传播的东西要多得多。

.NET 中的事件处理程序委托类型通常(不是特定于 ASP.NET)遵循使用Object sender作为第一个参数的模式,这意味着负责事件发生的对象。第二个参数是 ofEventArgs或子类(例如KeyEventArgs)以提供更多信息。EventArgs尽管在某些事件处理程序委托类型中拥有(几乎不包含任何信息)有点奇怪,但这确实意味着您可以注册一个“通用”事件处理程序,它可以处理任何符合该模式的事件。

(WPF 中的路由事件略有不同,IIRC,但您应该单独阅读这些内容。)

于 2013-02-13T18:07:32.083 回答
1

我正在阅读的一本书(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 或其子类。

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

于 2013-03-13T04:52:21.970 回答
0

这是关于事件方法签名应该是什么样子的整体 .Net 框架指南。有些事件使用参数(如文件观察器),有些则不使用(如您的情况)。

于 2013-02-13T18:08:27.373 回答