В большинстве случаев sender
- это Button
(или что-то еще), вызвавшее событие. Есть некоторые случаи, когда это не дело - например, (возможно, ленивое) сквозное событие:
class Foo {
private Bar bar;
public Foo(Bar bar) {
this.bar = bar;
}
public event EventHandler SomeEvent {
add {bar.SomeEvent += value;}
remove {bar.SomeEvent -= value;}
}
//...
}
Здесь, если мы подпишемся на foo.SomeEvent, мы на самом деле вернем событие, инициированное экземпляром Bar
, поэтому sender
не будет быть foo
. Но это возможно потому, что мы неправильно реализовали Foo.SomeEvent
.
Если честно, в большинстве случаев вам не нужно проверять sender
; основное время это полезно, когда несколько элементов управления совместно используют обработчик. Как правило, вы должны предполагать, что отправителем является экземпляр, на который вы подписаны (для целей проверки на равенство ссылок).
Re EventArgs
- стандартный шаблон (при создании нового типа события) рекомендует вам наследовать от этого. Я не рекомендую отклоняться от этого. Незначительная причина в том, что она позволяет использовать EventHandler<T>
, но есть и другие причины отклонений. Кроме того, иногда достаточно того, чего ожидают другие люди; люди ожидают * EventArgs
производное значение.
Тем не менее, раньше я проводил нестандартные события (в Push LINQ MiscUtil), но это было уже в очень необычной обстановке, поэтому оно не ощущалось неуместным.