1

フォームのデリゲートの理由を知りたいだけです

public delegate void EventHandler<TSender, TEventArgs>(
       TSender sender, 
       TEventArgs e
) 
where TEventArgs : EventArgs;

フレームワークには存在しません。以下だけを提供する理由はありますか?

public delegate void EventHandler<TEventArgs>(
     object sender,
     TEventArgs e
)
where TEventArgs : EventArgs;
4

1 に答える 1

1

「なぜ」という質問に答えるのは簡単ではありません。Microsoft の BCL エンジニアが別の方法ではなく、これを決定した理由を彼ら以外に誰が知っているのでしょうか? —しかし、私は経験に基づいた推測をします:

public delegate void EventHandler<TEventArgs>(
    Object sender,
    TEventArgs e
)
where TEventArgs : EventArgs

このデリゲート型は、"後付け" として .NET BCL に追加されたと想像できます。.NET 1.0 にはジェネリックがなかったことを思い出してください。

もう 1 つの理由は、イベント ハンドラーが 1 つの送信者のイベントのみを処理することが非常に多いためです。そのため、そのハンドラー内では、引数を確認しなくても送信者について既にわかっているsenderため、デリゲートを必要以上に汎用的にする理由はほとんどありません。実用的な目的。

通常、送信者よりもイベント引数に関心があるeため、ジェネリックにすることで不要な型キャストを回避することは理にかなっています。

于 2012-07-10T06:24:50.677 に答える