C#でイベントをプログラミングするときは、次の形式でデリゲートを作成することをお勧めします。
delegate XEventHandler(object sender, XEventArgs e);
私の質問は、デリゲートの最初の引数ですobject sender
。常にジェネリックである必要がありobject
ますか?タイプの送信者があると、object
常に次のようなコードになります。
val = ((ConcreteType)sender).Property;
または、さらに詳細な、
ConcreteType obj = sender as ConcreteType
if (obj != null) { ... }
強く型付けされた送信者に対する1つの議論は、他のオブジェクトが型を気にすることなくイベントを転送できることです。これはGUI環境では理にかなっているかもしれませんが、GUI以外でもメリットがあるかどうかはわかりません。
送信者のクラスが常に(少なくとも抽象クラスとして)わかっている場合はどうなりますか?私は実装していますたとえば、ListChanged
抽象的にイベントをList
クラス、および他のクラスは、(例えば、それを継承しようとしている場合はLinkedList
、ArrayList
)、それはタイプの送信者と私のデリゲートを定義するために、すべての権利でありますかList
?
delegate ListChangedEventHander(List sender, ListChangedEventArgs e);
または、従来型object sender
をより具体的なタイプに変更することの欠点はありますか?