2

ASP でのこのメソッド シグネチャの目的について興味があります。

protected void ddlChooseReport_Function(Object sender, EventArgs e) 

その後のメソッド本体では、どちらのパラメーターも言及されていないためです

4

3 に答える 3

4

イベントのイベント ハンドラーとしてEventHandler接続するには、メソッド シグネチャに互換性がなければなりません。インターフェースの実装に少し似ています。

特定の実装がたまたまそれらを使用していないからといって、それらが役に立たないというわけではありません。たとえば、同じイベント ハンドラーを使用して多くのコントロールのイベントを接続し、senderパラメーターを使用してそれらを区別することができます。また、イベントに関する追加情報をパラメーターを介して伝達することができますe。伝播できるEventArgsものはもっとたくさんあります。

一般に(ASP.NET に固有ではない) .NET のイベント ハンドラー デリゲート型はObject sender、最初のパラメーターとして使用するパターンに従います。これは、イベントの発生に関与するオブジェクトを意味します。2 番目のパラメータは、EventArgsまたはサブクラス (例: 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 に答える