__event

Deklaruje zdarzenie.

__event method-declarator; 
__event __interface interface-specifier; 
__event member-declarator;

Uwagi

Słowo kluczowe __event może być zastosowane do deklaracji metody, deklaracji interfejsu lub deklaracji elementu członkowskiego danych.Jednakże słowa kluczowego __event nie można używać, aby kwalifikować członka klasą zagnieżdżonej.

W zależności od tego, czy źródło zdarzenia i odbiornik są natywnym C++, COM lub zarządzane (.NET Framework) można użyć następujących konstrukcji jako zdarzenia:

Natywne C++

COM

Zarządzane (.NET Framework)

Metoda

metoda

interfejs

element członkowski danych

Należy użyć __hook w przypadku odbiornika zdarzenia do skojarzenia metody obsługi z metodą zdarzenia.Należy zauważyć, że po utworzeniu zdarzenia za pomocą słowa kluczowego __event, wszystkie procedury obsługi zdarzeń podłączone do tego zdarzenia zostaną wywołane po wywołaniu zdarzenia.

Deklaracja metody __event nie może mieć definicji; Definicja jest generowana niejawnie, więc metoda zdarzenia może być wywołana, tak jakby była ona zwykłą metodą.

[!UWAGA]

Oparte na szablonach klasy lub struktury nie mogą zawierać zdarzeń.

Zdarzenia natywne

Natywne zdarzenia są metodami.Typem zwracanym zazwyczaj jest HRESULT lub void, ale może to być dowolny typ całkowity, łącznie z enum.Gdy zdarzenie używa całkowitego typu jako wartości zwracanej, warunek błędu jest definiowany, gdy program obsługi zdarzenia zwraca wartość różną od zera i w takim przypadku zdarzenie wywołuje inne delegaty.

// Examples of native C++ events:
__event void OnDblClick();
__event HRESULT OnClick(int* b, char* s);

Zobacz Obsługa zdarzeń w natywnym języku C++, aby uzyskać przykładowy kod.

Zdarzenia COM

Zdarzenia COM są interfejsami.Parametry metody w źródłowym interfejsie zdarzenia powinny być parametrami in (ale nie jest to wymuszane rygorystycznie), ponieważ parametr out nie jest przydatny przy multiemisji.Ostrzeżenie poziomu 1 zostanie zgłoszone podczas użycia parametru out.

Typem zwracanym zazwyczaj jest HRESULT lub void, ale może to być dowolny typ całkowity, łącznie z enum.Gdy zdarzenie zwraca typ całkowity i program obsługi zdarzenia zwraca wartość różną od zera, jest to warunek błędu i w takim przypadku zdarzenie pomija inne delegaty.Należy zwrócić uwagę, że kompilator automatycznie zaznaczy interfejs źródłowy zdarzenia jako source w wygenerowanym IDL.

Słowo kluczowe __interface jest zawsze wymagane po __event dla zdarzenia źródłowego COM.

// Example of a COM event:
__event __interface IEvent1;

Zobacz Obsługa zdarzeń COM, aby uzyskać przykładowy kod.

Zdarzenia zarządzane

Aby uzyskać informacje na temat kodowania zdarzeń w nowej składni, zobacz Zdarzenie (Visual C++).

Zarządzane zdarzenia są elementami członkowskimi danych lub metodami.Podczas używana zdarzenia, typ zwracany delegata musi być zgodny z Common Language Specification.Typ zwracany modułu obsługi zdarzeń musi odpowiadać zwracanemu typowi obiektu delegowanego.Aby uzyskać więcej informacji na temat delegatów, zobacz __delegate.Jeśli zdarzenie zarządzane jest elementem członkowskim danych, jego typem musi być wskaźnik do delegata.

W.NET Framework można traktować członka danych, jak gdyby był samą metodą (to znaczy Invoke metodą swojego odpowiedniego obiektu delegowanego).Należy wstępnie zdefiniować typ obiektu delegowanego do deklarowania zarządzanego elementu członkowskiego danych zdarzenia.Natomiast metoda zarządzanych zdarzeniami niejawnymi definiuje odpowiednie obiekt delegowany, jeśli nie jest już zdefiniowany.Na przykład, można zadeklarować wartość zdarzenia takiego jak OnClick jako zdarzenie, w następujący sposób:

// Examples of managed events:
__event ClickEventHandler* OnClick;  // data member as event
__event void OnClick(String* s);  // method as event

Podczas jawnej deklaracji zdarzenia zarządzanego, można określić metody dostępu add i remove, które będą wywoływane, gdy programy obsługi zdarzeń będą dodawane lub usuwane.Można także zdefiniować metodę, która wywołuje (zgłasza) zdarzenie z poza klasy.

Przykład: Zdarzenia natywne

// EventHandling_Native_Event.cpp
// compile with: /c
[event_source(native)]
class CSource {
public:
   __event void MyEvent(int nValue);
};

Przykład: Zdarzenia COM

// EventHandling_COM_Event.cpp
// compile with: /c
#define _ATL_ATTRIBUTES 1
#include <atlbase.h>
#include <atlcom.h>

[ module(dll, name="EventSource", uuid="6E46B59E-89C3-4c15-A6D8-B8A1CEC98830") ];

[ dual, uuid("00000000-0000-0000-0000-000000000002") ]
__interface IEventSource {
   [id(1)] HRESULT MyEvent();
};
 [ coclass, uuid("00000000-0000-0000-0000-000000000003"),  event_source(com) ]
class CSource : public IEventSource {
public:
   __event __interface IEventSource;
   HRESULT FireEvent() {
      __raise MyEvent();
      return S_OK;
   }
};

Przykład: Zdarzenia zarządzane

// EventHandling_Managed_Event.cpp
// compile with: /clr:oldSyntax /c
using namespace System;
[event_source(managed)]
public __gc class CPSource {

public:
   __event void MyEvent(Int16 nValue);
};

Podczas stosowania atrybutu na zdarzeniu, można określić, czy atrybut dotyczy wygenerowanych metod lub metody Invoke wygenerowanego delegata. Domyślnie (event:) stosuje atrybut do zdarzenia.

// EventHandling_Managed_Event_2.cpp
// compile with: /clr:oldSyntax /c
using namespace System;
[attribute(All, AllowMultiple=true)]
public __gc class Attr {};

public __delegate void D();

public __gc class X {
public:
   [method:Attr] __event D* E;
   [returnvalue:Attr] __event void noE();
};

Zobacz też

Informacje

Słowa kluczowe języka C++

Obsługa zdarzeń

event_source

event_receiver

__hook

__unhook

__raise