Что на самом деле делает ключевое слово события? - PullRequest
11 голосов
/ 07 июня 2011
public delegate void SecondChangedHandler(
        object clock, 
        TimeInfoEventArgs timeInformation);

    public event SecondChangedHandler SecondChanged;

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

Ответы [ 5 ]

12 голосов
/ 07 июня 2011

Это составлено по-другому.Это делает так, чтобы кто-то не мог сделать

mySecondChangedHandler.SecondChanged = SomeMethod(...); //overwrite
mySecondChangedHandler.SecondChanged(...); //invoke

, а только

mySecondChangedHandler.SecondChanged += SomeMethod(...);
mySecondChangedHandler.SecondChanged -= SomeMethod(...);
6 голосов
/ 07 июня 2011

Ключевое слово event создает приватное поле делегата и пару открытых средств доступа к событиям , называемых add_EventName и remove_EventName. ( подробности )

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

Вне класса EventName на самом деле не существует; все, что вы можете сделать, это написать EventName += something и EventName -= something, и компилятор преобразует его в вызовы методов доступа. (как собственность)

Подробнее см. эту серию сообщений в блоге .

2 голосов
/ 07 июня 2011

Ключевое слово события делает две вещи

  • Предоставлены разрешения.Только класс может вызвать событие, однако любой внешний метод может вызвать необработанный делегат
  • . Он предоставляет метаданные, которые могут использоваться для дизайнеров и т. П.
1 голос
/ 07 июня 2011

Ключевое слово event создает пару аксессоров для делегата.По сути, это два метода (add и remove), которые вызываются, когда вы подписываетесь или отписываетесь от события.

В вашем случае вы 'воссоздание «поля как событие».Компилятор создает делегат за кулисами и позволяет вам подписаться и отписаться от его списка вызовов.Это означает, что у вас есть все функции делегата, но вы ограничиваете доступ, чтобы внешний мир мог «обрабатывать» событие, но не вызывать его (вызывать делегата).

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

1 голос
/ 07 июня 2011

Ключевые слова event означают, что только методы в экземпляре, в котором размещено поле SecondChanged, могут вызывать его. Внешние попытки потерпят неудачу.

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