Поделиться через


event ключевое слово (C++/CLI и C++/CX)

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

Все среды выполнения

C++/CX поддерживает объявление элемента события или блока событий. Член события является сокращением для объявления блока событий. По умолчанию член события объявляет функции add, remove и raise, явно объявленные в блоке событий. Для настройки функций в члене события объявите блок событий и затем переопределите нужные вам функции.

Синтаксис

// event data member
modifier event delegate^ event_name;

// event block
modifier event delegate^ event_name
{
   modifier return_value add(delegate^ name);
   modifier void remove(delegate^ name);
   modifier void raise(parameters);
}

Параметры

modifier
Модификатор, который может использоваться в объявлении события или в методе доступа события. Возможные значения: static и virtual.

delegate
Делегат, сигнатура которого должна соответствовать обработчику событий.

event_name
Имя события.

return_value
Возвращаемое значение метода доступа события. Чтобы быть проверяемым, возвращаемый тип должен быть void.

parameters
(Необязательно) Параметры для метода raise, соответствующие сигнатуре параметра delegate.

Замечания

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

Существует два вида объявлений событий.

Элемент данных события
Компилятор автоматически создает хранилище для события в виде члена типа делегата и создает внутренние функции-члены add, remove и raise. Элемент данных события должен объявляться внутри класса. Тип возвращаемого значения типа возвращаемого значения делегата должен соответствовать типу возвращаемого значения обработчика событий.

Блок событий
Блок событий позволяет явно объявить и настроить поведение методов add, remove и raise.

Вы можете использовать operator += и добавлять и operator -= удалять обработчик событий или вызывать add remove методы явным образом.

event — контекстно-зависимое ключевое слово. Дополнительные сведения см. в разделе "Ключевые слова с учетом контекста".

Среда выполнения Windows

Замечания

Дополнительные сведения см. в статье Events (C++/CX) (События (C++/CX)).

Чтобы добавить и удалить обработчик событий, сохраните EventRegistrationToken структуру, возвращаемую операцией add . Затем в remove операции используйте сохраненную EventRegistrationToken структуру для идентификации обработчика событий для удаления.

Требования

Параметр компилятора: /ZW

Среда CLR

Ключевое слово event позволяет объявить событие. Событие — это способ, которым класс предоставляет уведомление о том, что произошло нечто интересное.

Синтаксис

// event data member
modifier event delegate^ event_name;

// event block
modifier event delegate^ event_name
{
   modifier return_value add(delegate^ name);
   modifier void remove(delegate^ name);
   modifier void raise(parameters);
}

Параметры

modifier
Модификатор, который может использоваться в объявлении события или в методе доступа события. Возможные значения: static и virtual.

delegate
Делегат, сигнатура которого должна соответствовать обработчику событий.

event_name
Имя события.

return_value
Возвращаемое значение метода доступа события. Чтобы быть проверяемым, возвращаемый тип должен быть void.

parameters
(Необязательно) Параметры для метода raise, соответствующие сигнатуре параметра delegate.

Замечания

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

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

Существует два типа объявлений событий:

Элементы данных события
Компилятор создает хранилище для событий элементов данных в качестве члена типа делегата. Элемент данных события должен объявляться внутри класса. Это также известно как тривиальное событие. Пример кода см. в примере кода.

Блоки событий
Блоки событий позволяют настраивать поведение addremoveметодов и raise методов, реализуя методы и raise реализуя removeaddметоды. Подпись и addremoveraise методы должны соответствовать сигнатуре делегата. События блока событий не являются элементами данных. Любое использование в качестве члена данных создает ошибку компилятора.

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

В платформе .NET Framework данные-член можно рассматривать, как если бы это был сам метод (т. е., метод Invoke соответствующего делегата). Для этого предопределите тип делегата для объявления элемента данных управляемого события. Напротив, метод управляемого события неявно определяет соответствующий управляемый делегат, если он еще не определен. Пример кода см. в конце этой статьи.

При объявлении управляемого события можно указать add и remove методы доступа, которые будут вызываться при добавлении или удалении обработчиков событий с помощью операторов += и -=. removeМетоды addи raise методы можно вызывать явным образом.

Для создания и использования событий в Microsoft C++необходимо выполнить следующие действия.

  1. Создать или определить делегат. Если вы определяете собственное событие, необходимо также убедиться, что с ключевым словом используется делегат event . Если событие является предопределенным, например в .NET Framework, то потребителям этого события нужно знать только имя делегата.

  2. Создать класс, содержащий следующие объекты.

    • Событие, созданное из делегата.

    • (Необязательно) Метод, который проверяет наличие экземпляра делегата, объявленного ключевым словом event . В противном случае эту логику необходимо разместить в коде, который инициирует событие.

    • Методы, которые вызывают события. Эти методы могут быть переопределениями некоторых функциональных возможностей базового класса.

    Этот класс определяет событие.

  3. Определить один или несколько классов, которые связывают методы с событием. Каждый из этих классов будет связывать один или несколько методов с событием в базовом классе.

  4. Использовать событие.

    • Создать объект класса, содержащего объявление события.

    • Создать объект класса, содержащего определение события.

Дополнительные сведения о событиях C++/CLI см. в разделе "События" в интерфейсе.

Требования

Параметр компилятора: /clr

Примеры

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

// mcppv2_events.cpp
// compile with: /clr
using namespace System;

// declare delegates
delegate void ClickEventHandler(int, double);
delegate void DblClickEventHandler(String^);

// class that defines events
ref class EventSource {
public:
   event ClickEventHandler^ OnClick;   // declare the event OnClick
   event DblClickEventHandler^ OnDblClick;   // declare OnDblClick

   void FireEvents() {
      // raises events
      OnClick(7, 3.14159);
      OnDblClick("Hello");
   }
};

// class that defines methods that will called when event occurs
ref class EventReceiver {
public:
   void OnMyClick(int i, double d) {
      Console::WriteLine("OnClick: {0}, {1}", i, d);
   }

   void OnMyDblClick(String^ str) {
      Console::WriteLine("OnDblClick: {0}", str);
   }
};

int main() {
   EventSource ^ MyEventSource = gcnew EventSource();
   EventReceiver^ MyEventReceiver = gcnew EventReceiver();

   // hook handler to event
   MyEventSource->OnClick += gcnew ClickEventHandler(MyEventReceiver, &EventReceiver::OnMyClick);
   MyEventSource->OnDblClick += gcnew DblClickEventHandler(MyEventReceiver, &EventReceiver::OnMyDblClick);

   // invoke events
   MyEventSource->FireEvents();

   // unhook handler to event
   MyEventSource->OnClick -= gcnew ClickEventHandler(MyEventReceiver, &EventReceiver::OnMyClick);
   MyEventSource->OnDblClick -= gcnew DblClickEventHandler(MyEventReceiver, &EventReceiver::OnMyDblClick);
}
OnClick: 7, 3.14159

OnDblClick: Hello

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

// trivial_events.cpp
// compile with: /clr /c
using namespace System;
public delegate int Del();
public ref struct C {
   int i;
   event Del^ MyEvent;

   void FireEvent() {
      i = MyEvent();
   }
};

ref struct EventReceiver {
   int OnMyClick() { return 0; }
};

int main() {
   C c;
   c.i = 687;

   c.FireEvent();
   Console::WriteLine(c.i);
   c.i = 688;

   EventReceiver^ MyEventReceiver = gcnew EventReceiver();
   c.MyEvent += gcnew Del(MyEventReceiver, &EventReceiver::OnMyClick);
   Console::WriteLine(c.i);
}
0

688

См. также

Расширения компонентов для .NET и UWP