Основная цель событий в C#

Я исследовал одну из своих книг c#, и я просто видел предложение о Событиях в C#:
 Основная цель событий состоит в том, чтобы препятствовать тому, чтобы подписчики вмешались друг в друга.

Независимо от того, что это означает, да на самом деле, события работают в значительной степени как делегаты.
Я задавался вопросом, почему я должен использовать события вместо делегатов.

Так есть ли кто-либо, кто может объяснить полужирную часть?

Заранее спасибо.

12
задан lexu 6 April 2010 в 06:29
поделиться

4 ответа

Выбор был бы не между делегатом и мероприятием - это совершенно разные вещи. Однако вы можете предоставить общедоступное свойство или общедоступное поле , имеющее тип делегата. Я полагаю, это то, что вы на самом деле имеете в виду.

Предположим, что 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)

Нарушение инкапсуляции исчезнет, ​​но вы потеряете часть удобства - и каждый должен написать свои собственные методы, подобные этому . События в основном упрощают эту схему.

14
ответ дан 2 December 2019 в 05:40
поделиться

Вы можете установить для делегата значение NULL, что заставит его «забыть» все функции, которые на него подписаны.

3
ответ дан 2 December 2019 в 05:40
поделиться

Вы можете добавить к своему событию столько обработчиков событий, сколько захотите.

0
ответ дан 2 December 2019 в 05:40
поделиться

Событие может быть вызвано только определяющим его классом, тогда как делегат может быть вызван любым лицом, имеющим к нему доступ. Вот что, как мне кажется, означает жирный текст.

Кроме того, событие может быть определено в интерфейсе, тогда как делегат не может (как если бы вы объявили делегат как поле).

Я рекомендую прочитать эту ссылку , поскольку она довольно хорошо объясняет и содержит еще несколько примеров, помимо упомянутых выше.

10
ответ дан 2 December 2019 в 05:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: