Что действительно делает ключевое слово event?

public delegate void SecondChangedHandler(
        object clock, 
        TimeInfoEventArgs timeInformation);

    public event SecondChangedHandler SecondChanged;

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

Ответ 1

Он скомпилирован по-разному. Это делает так, что кто-то не может сделать

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

но только

mySecondChangedHandler.SecondChanged += SomeMethod(...);
mySecondChangedHandler.SecondChanged -= SomeMethod(...);

Ответ 2

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

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

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