Объявление события - это на самом деле просто особый вид свойства, который используется для предоставления делегата.Однако вместо того, чтобы получать и устанавливать методы доступа, создаются и удаляются.Обычно они реализуются автоматически, но при желании вы можете добавить пользовательское поведение:
private MyEventHandler handler;
public event MyEventHandler MyEvent {
add {
handler += value;
Trace.WriteLine("MyEvent handler attached.");
}
remove {
handler -= value;
Trace.WriteLine("MyEvent handler removed.");
}
}
Это делает две вещи.Во-первых, поскольку события являются свойствами, они могут быть включены в интерфейсы.Во-вторых, поскольку MyEvent не возвращает значение, делегат полностью инкапсулируется, и только объект, которому он принадлежит, может вызвать его.Другие способы представления делегатов приводят к тому, что делегатом может быть вызван практически любой человек.
Помимо этой особой языковой поддержки, другим важным отличием между событиями и делегатами является соглашение, а не функция языка или структуры.: Ожидается, что события будут следовать определенным шаблонам , например, убедитесь, что делегат, на котором основано событие, следует шаблону, установленному делегатом EventHandler .
Как правило, события предпочтительны, когда семантика - это объект, уведомляющий любого, кто интересуется изменением его стадии.Делегаты предпочтительнее в ситуациях, когда вы хотите, чтобы другие могли определять поведение, предоставляя свою собственную процедуру, такую как параметры делегата, которые принимаются многими методами расширения в IEnumerable, которые используются в LINQ.