Condividi tramite


__event

Dichiara un evento.

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

Note

La parola chiave __event può essere applicato a una dichiarazione di metodo, a una dichiarazione di interfaccia, o una dichiarazione del membro dati.Tuttavia, non è possibile utilizzare la parola chiave __event per qualificare un membro di una classe annidata.

In base all'origine evento e che sono nativo C++, COM, o gestito (.NET Framework, è possibile utilizzare i seguenti costrutti come eventi:

C++ nativo

COM

Gestito (.NET Framework)

Metodo

metodo

interface

membro dati

Utilizzo __hook in un ricevitore di eventi associare un metodo del gestore con un metodo di evento.Si noti che dopo aver creato un evento con la parola chiave __event, tutti i gestori eventi avanti agganciati a tale evento verranno chiamati quando viene chiamato.

Una dichiarazione di metodo __event non può avere una definizione, una definizione in modo implicito viene generata un'eccezione, pertanto il metodo di evento può essere chiamato come se fosse un metodo comune.

[!NOTA]

Una classe o una struttura basata su template non può contenere eventi.

Eventi nativi

Gli eventi nativi sono metodi.Il tipo restituito è in genere HRESULT o void, ma può essere qualsiasi tipo integrale, inclusi enum.Quando un evento utilizza un tipo restituito integrale, una condizione di errore è definita quando un gestore eventi restituisce un valore diverso da zero, nel qual caso l'evento generato chiamerà gli altri delegati.

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

Vedere Gestione degli eventi in C++ nativo per il codice di esempio.

Eventi COM

Gli eventi COM sono interfacce.I parametri di un metodo in un'interfaccia di origine evento devono essere parametri in (ma esclusivamente non è applicabile), perché un parametro out non è utile quando multicasting.Un avviso di Livello 1 verrà generato se si utilizza un parametro out.

Il tipo restituito è in genere HRESULT o void, ma può essere qualsiasi tipo integrale, inclusi enum.Quando un evento utilizza un tipo restituito integrali e restituisce un gestore di eventi un valore diverso da zero, è una condizione di errore, nel qual caso l'evento che viene interrotta generate chiama gli altri delegati.Si noti che il compilatore automaticamente contrassegnato automaticamente un'interfaccia di origine evento come database di origine in IDL generato.

La parola chiave __interface è sempre richiesta dopo __event per un'origine evento COM.

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

Vedere Gestione degli eventi in COM per il codice di esempio.

Eventi gestiti

Per informazioni sugli eventi di codifica nella nuova sintassi, vedere evento (Visual C++).

Gli eventi gestiti sono membri dati o metodi.Se utilizzato con un evento, il tipo restituito di un delegato deve essere conforme a Common Language Specification).Il tipo restituito del gestore eventi deve corrispondere al tipo restituito del delegato.Per ulteriori informazioni sui delegati, vedere __delegate.Se un evento gestito è un membro dati, il tipo deve essere un puntatore a un delegato.

In.NET Framework, è possibile trattare un membro dati come se fosse un metodo stesso ovvero il metodo Invoke del delegato corrispondente.È necessario predefinire il tipo delegato per la dichiarazione del membro gestito di dati degli eventi.Al contrario, un metodo gestito di evento in modo implicito definisce il delegato gestito corrispondente se non è già definito.Ad esempio, è possibile dichiarare un valore di evento come OnClick come evento come segue:

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

Nel dichiarare in modo implicito un evento gestito, è possibile specificare aggiungere e rimuovere le funzioni di accesso che verrà chiamato quando i gestori eventi vengono aggiunti o rimossi.È inoltre possibile definire il metodo che chiama () genera l'evento esterno della classe.

Esempio: eventi nativi

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

Esempio: Eventi 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;
   }
};

Esempio: eventi gestiti

// 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);
};

Nell'applicare un attributo a un evento, è possibile specificare che l'attributo viene applicato ai metodi generati o al metodo di chiamata al delegato generato.L'impostazione predefinita (event:) consente di applicare l'attributo all'evento.

// 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();
};

Vedere anche

Riferimenti

Parole chiave C++

Gestione degli eventi

event_source

event_receiver

__hook

__unhook

__raise