ASP でのこのメソッド シグネチャの目的について興味があります。
protected void ddlChooseReport_Function(Object sender, EventArgs e)
その後のメソッド本体では、どちらのパラメーターも言及されていないためです
イベントのイベント ハンドラーとしてEventHandler
接続するには、メソッド シグネチャに互換性がなければなりません。インターフェースの実装に少し似ています。
特定の実装がたまたまそれらを使用していないからといって、それらが役に立たないというわけではありません。たとえば、同じイベント ハンドラーを使用して多くのコントロールのイベントを接続し、sender
パラメーターを使用してそれらを区別することができます。また、イベントに関する追加情報をパラメーターを介して伝達することができますe
。伝播できるEventArgs
ものはもっとたくさんあります。
一般に(ASP.NET に固有ではない) .NET のイベント ハンドラー デリゲート型はObject sender
、最初のパラメーターとして使用するパターンに従います。これは、イベントの発生に関与するオブジェクトを意味します。2 番目のパラメータは、EventArgs
またはサブクラス (例: KeyEventArgs
) で、詳細情報を提供します。一部のイベント ハンドラー デリゲート タイプに (ほとんど情報が含まれていない)というのは少し奇妙ですが、パターンに準拠する任意のEventArgs
イベントを処理できる "汎用" イベント ハンドラーを登録できることを意味します。
(WPF のルーティング イベントは IIRC とは少し異なりますが、それらについては個別に確認する必要があります。)
私が読んでいる本 (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 フレームワークの全体的なガイドラインです。一部のイベントは引数を使用します(ファイルウォッチャーなど)、一部のイベントは引数を使用しません(あなたの場合のように)。