1. ホーム
  2. c#

C#のイベントハンドラでは、なぜ "sender "パラメータはオブジェクトでなければならないのですか?

2023-12-05 02:37:11

質問

によると マイクロソフトイベント命名ガイドライン sender C# のイベントハンドラのパラメータ "は 常に であり、たとえより特殊な型を使用することが可能であっても、オブジェクト型です。

というようなイベント処理コードがたくさん出てくることになります。

RepeaterItem item = sender as RepeaterItem;
if (item != null) { /* Do some stuff */ }

なぜ規約では、より具体的な型を持つイベントハンドラを宣言することを勧めているのでしょうか?

MyType
{
    public event MyEventHander MyEvent;
}

...

delegate void MyEventHander(MyType sender, MyEventArgs e);

何か見逃してない?

後学のために。私は、回答者の一般的な意見に同意します。 を使用することです。 EventArgs を介してデータを渡す) ことです。 です。 は慣習に従うことが重要です。

編集:検索のための餌 RSPEC-3906ルール "イベントハンドラは正しいシグネチャを持つべきである"

どのように解決するのですか?

これはルールというよりパターンです。あるコンポーネントが他のコンポーネントからイベントを転送し、それがイベントを発生させる通常のタイプでない場合でも、元の送信者を維持できることを意味します。

私はそれが少し奇妙であることに同意します - しかし、親しみのために慣習に固執する価値はあるでしょう。(他の開発者にとっての親しみやすさ、です。) 私はこれまで、特に EventArgs それ自体では何の情報も伝わらないからです)しかし、それは別の話題です。(少なくとも、私たちは EventHandler<TEventArgs> があれば助かるのですが......。 EventArgs<TContent> があれば便利なのですが...。)

EDIT: もちろん、デリゲートをより汎用的にすることはできます。特にジェネリックの観点からは、それが特に良い理由だとは思えませんが、おそらくは 何か ...