Следующие две строки кода почти эквивалентны:
public event Action<EmployeeEventAgs> Leave;
по сравнению с:
public event EventHandler<EmployeeEventAgs> Leave;
Разница заключается в сигнатуре метода обработчика событий. Если вы используете первый подход с действием, вы можете иметь:
public void LeaveHandler(EmployeeEventAgs e) { ... }
, а затем это:
obj.Leave += LeaveHandler;
При втором подходе подпись LeaveHandler
должна отличаться:
public void LeaveHandler(object sender, EmployeeEventAgs e) { ... }
очень важно отметить, что в обоих случаях ключевое слово event
используется для объявления члена события. Элемент события, объявленный таким образом, не является просто полем класса, несмотря на то, что выглядит так, как если бы он был. Вместо этого компилятор создает его как свойство события 1 . Свойства события аналогичны обычным свойствам, за исключением того, что они не имеют get
или set
методов доступа. Компилятор позволяет использовать их только в левой части назначений +=
и -=
(добавление или удаление обработчика событий). невозможно переписать уже назначенные обработчики событий или вызвать событие вне класса, который объявляет it.
Если ключевое слово события отсутствует в обоих примерах, вы можете выполнить следующие операции без ошибок или предупреждений:
obj.Leave = LeaveHandler;
, который удалит все зарегистрированные обработчики и заменит их LeaveHandler
.
Кроме того, вы также можете выполнить этот вызов:
obj.Leave(new EmployeeEventAgs());
Две вышеупомянутые ситуации считаются антишаблоном , если вы собираетесь создать событие. Событие должно вызываться только объектом-владельцем и не должно допускать не отслеживаемое удаление подписчиков. Ключевое слово event
- это программная конструкция .NET, которая помогает вам правильно использовать события.
Имея в виду вышеизложенное, я полагаю, что многие люди придерживаются подхода EventHandler
, потому что вряд ли будет использоваться EventHandler
без ключевого слова event
. Действия имеют более широкую область применения, они не выглядят так естественно, когда используются как события. Последнее, конечно, личное мнение, так как подход к обработчику событий, вероятно, стал слишком жестким в моей собственной практике кодирования. Тем не менее, если действия используются правильно, использование событий для событий не является преступлением.
1 Свойство события - это то, что компилятор автоматически генерирует при просмотре кода, подобного этому:
event EventHandler SomeEvent
Код становится примерно таким же, как следующий:
private EventHandler _someEvent; // notice the lack of the event keyword!
public event EventHandler SomeEvent
{
add { _someEvent += value; }
remove { _someEvent -= value; }
}
Вызовы событий, которые мы записываем так:
this.SomeEvent(sender, args);
конвертируется в это:
this._someEvent(sender, args);