Основная цель событий в C # - PullRequest
12 голосов
/ 06 апреля 2010

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

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

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

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

Ответы [ 4 ]

14 голосов
/ 06 апреля 2010

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

Предположим, Button.Click было открытым полем или свойством вместо события. Затем один фрагмент кода может подписаться на событие, а другой может написать:

// Invalid with events, valid with properties
button.Click = null;

, таким образом уничтожая оригинальный обработчик событий. Аналогично, другой код также может вызывать обработчики событий:

// Invalid with events, valid with properties
button.Click(this, EventArgs.Empty);

даже если кнопка не была нажата. Это явно нарушение инкапсуляции. Единственная причина выставить Click другому коду - позволить им регистрировать интерес к нажатию кнопок и регистрировать незаинтересованность позже - и это именно те возможности, которые предоставляют события.

Думайте о событиях как о синтаксическом сахаре вокруг двух методов. Например, если бы у нас не было событий, то Button, вероятно, будет иметь:

public void AddClickHandler(EventHandler handler)
public void RemoveClickHandler(EventHandler handler)

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

10 голосов
/ 06 апреля 2010

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

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

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

3 голосов
/ 06 апреля 2010

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

0 голосов
/ 06 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...