Событие - это просто операция добавления и удаления. Вы не можете получить значение, вы не можете установить значение, вы не можете вызвать его - вы можете просто подписать обработчик на событие (add
) или отменить подписку (remove
). Это хорошо - это инкапсуляция, простая и понятная. Издатель должен соответствующим образом реализовать добавление / удаление, но если издатель не решит сделать детали доступными, подписчики не смогут изменить или получить доступ к частям, связанным с реализацией.
Полевые события в C # (где вы не указываете биты добавления / удаления) скрывают это - они создают переменную типа делегата и событие. Реализации добавления / удаления события просто используют переменную для отслеживания подписчиков.
Внутри класса вы ссылаетесь на переменную (чтобы вы могли получить подписанных в данный момент делегатов, выполняете их и т. Д.), А вне класса вы ссылаетесь на само событие (поэтому имеете только возможности добавления / удаления).
Альтернатива полевым событиям - это то, где вы явно реализуете добавление / удаление самостоятельно, например
private EventHandler clickHandler; // Normal private field
public event EventHandler Click
{
add
{
Console.WriteLine("New subscriber");
clickHandler += value;
}
remove
{
Console.WriteLine("Lost a subscriber");
clickHandler -= value;
}
}
См. мою статью о событиях для получения дополнительной информации.
Конечно, издатель событий может также сделать доступной дополнительную информацию - вы можете написать свойство, например ClickHandlers
, для возврата текущего многоадресного делегата, или HasClickHandlers
для возврата, есть ли или не. Это не является частью модели основного события.