Я исследовал одну из своих книг c#, и я просто видел предложение о Событиях в C#:
Основная цель событий состоит в том, чтобы препятствовать тому, чтобы подписчики вмешались друг в друга.
Независимо от того, что это означает, да на самом деле, события работают в значительной степени как делегаты.
Я задавался вопросом, почему я должен использовать события вместо делегатов.
Так есть ли кто-либо, кто может объяснить полужирную часть?
Заранее спасибо.
Выбор был бы не между делегатом и мероприятием - это совершенно разные вещи. Однако вы можете предоставить общедоступное свойство или общедоступное поле , имеющее тип делегата. Я полагаю, это то, что вы на самом деле имеете в виду.
Предположим, что Button.Click
были публичным полем или свойством, а не событием. Затем один фрагмент кода мог бы подписаться на событие, а другой мог бы написать:
// Invalid with events, valid with properties
button.Click = null;
, тем самым уничтожив исходный обработчик событий. Точно так же другой код также сможет вызвать обработчики событий:
// Invalid with events, valid with properties
button.Click(this, EventArgs.Empty);
, даже если кнопка не была нажата. Это явно нарушение инкапсуляции. Единственная причина раскрыть Click
другому коду - позволить им регистрировать интерес к нажатию кнопок и регистрировать отсутствие интереса позже - и это именно те возможности, которые предоставляют события.
Думайте о событиях как о синтаксическом сахаре вокруг двух методов. Например, если бы у нас не было событий, то кнопка
, вероятно, имела бы:
public void AddClickHandler(EventHandler handler)
public void RemoveClickHandler(EventHandler handler)
Нарушение инкапсуляции исчезнет, но вы потеряете часть удобства - и каждый должен написать свои собственные методы, подобные этому . События в основном упрощают эту схему.
Вы можете установить для делегата значение NULL, что заставит его «забыть» все функции, которые на него подписаны.
Вы можете добавить к своему событию столько обработчиков событий, сколько захотите.
Событие может быть вызвано только определяющим его классом, тогда как делегат может быть вызван любым лицом, имеющим к нему доступ. Вот что, как мне кажется, означает жирный текст.
Кроме того, событие может быть определено в интерфейсе, тогда как делегат не может (как если бы вы объявили делегат как поле).
Я рекомендую прочитать эту ссылку , поскольку она довольно хорошо объясняет и содержит еще несколько примеров, помимо упомянутых выше.