evento (Extensões de Componentes C++)
A palavra-chave event declara um evento, que é uma notificação para assinantes registrados (manipuladores de eventos) de que algo interessante ocorreu.
Todos os tempos de execução
C++/CX dá suporte à declaração de um membro de evento ou de um bloco de evento.Um membro de evento é a maneira mais rápida de declarar um bloco de evento.Por padrão, um membro de evento declara funções add(), remove() e raise() que são explicitamente declaradas em um bloco de evento.Para personalizar as funções em um membro de evento, declare um bloco de evento em vez de substituir as funções de que você precisa.
Sintaxe
// 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);
}
Parâmetros
modificador
Um modificador que pode ser usado na declaração de evento ou um método de acessador de evento.Os valores possíveis são static e virtual.delegado
O delegado, a cuja assinatura o manipulador de eventos deve corresponder.nome_do_evento
O nome do evento.valor_de_retorno
O valor de retorno do método acessador do evento.Para ser passível de verificação, o tipo de retorno deve ser void.parâmetros
(opcional) Parâmetros para o método raise, que correspondam à assinatura do parâmetro delegate.
Comentários
Um evento é uma associação entre um representante e uma função de membro (manipulador de eventos) que responde ao disparo do evento e permite que clientes de qualquer classe registrem métodos que estejam de acordo com a assinatura e o tipo de retorno do delegado subjacente.
Há dois tipos de declarações de eventos:
membro de dados de evento
O compilador cria automaticamente armazenamento para o evento na forma de um membro do tipo delegado e cria funções de membro add(), remove() e raise() internas.Um membro de dados do evento deve ser declarado em uma classe.O tipo de retorno do delegado deve corresponder ao tipo de retorno do manipulador de eventos.bloco de evento
Um bloco de evento permite que você declare explicitamente e personalize o comportamento dos métodos add(), remove() e raise().
Você pode usar operators+= e operator-= para adicionar e remover um manipulador de eventos, ou chamar os métodos add() e remove() explicitamente.
event é uma palavra-chave sensível ao contexto; consulte Palavras-chave Contextuais (Extensões de Componentes C++) para obter mais informações.
Tempo de Execução do Windows
Comentários
Para obter mais informações, consulte Eventos (C++/CX).
Se você pretende adicionar e então remover um manipulador de eventos, deverá salvar a estrutura de EventRegistrationToken que é retornada pela operação de adição.Em seguida, na operação de remoção, você deve usar a estrutura EventRegistrationToken salva para identificar o manipulador de eventos a ser removido.
Requisitos
Opção do compilador: /ZW
Common Language Runtime
A palavra-chave event permite que você declare um evento.Um evento é uma maneira para que uma classe ofereça notificações quando algo de interesse acontecer.
Sintaxe
// 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);
}
Parâmetros
modificador
Um modificador que pode ser usado na declaração de evento ou um método de acessador de evento.Os valores possíveis são static e virtual.delegado
O delegado, a cuja assinatura o manipulador de eventos deve corresponder.nome_do_evento
O nome do evento.valor_de_retorno
O valor de retorno do método acessador do evento.Para ser passível de verificação, o tipo de retorno deve ser void.parâmetros
(opcional) Parâmetros para o método raise, que correspondam à assinatura do parâmetro delegate.
Comentários
Um evento é uma associação entre um representante e uma função de membro (manipulador de eventos) que responde ao disparo do evento e permite que clientes de qualquer classe registrem métodos que estejam de acordo com a assinatura e o tipo de retorno do delegado subjacente.
O delegado pode ter um ou mais métodos associados que serão chamados quando seu código indicar que o evento ocorreu.Um evento em um programa pode ser disponibilizado para outros programas direcionados para o common language runtime do .NET Framework.Consulte Gerando um evento definido em um assembly diferente para obter um exemplo.
Há dois tipos de declarações de eventos:
membros de dados de evento
O armazenamento para o evento, na forma de um membro de tipo delegado, é criado pelo compilador para eventos do membro de dados.Um membro de dados do evento deve ser declarado em uma classe.Isso também é conhecido como um evento trivial (consulte o exemplo de código abaixo).blocos de evento
Blocos de evento permitem que você personalize o comportamento dos métodos adicionar, remover e gerar ao implementar métodos adicionar, remover e gerar.A assinatura dos métodos adicionar, remover e acionar deve corresponder à assinatura do delegado.Os eventos do bloco de evento não são membros de dados e qualquer uso como um membro de dados gerará um erro de compilador.Consulte Definindo métodos acessadores de evento para obter um exemplo.
O tipo de retorno do manipulador de eventos deve corresponder ao tipo de retorno do delegado.
No .NET Framework, você pode tratar um membro de dados como se fosse um método (isto é, o método Invoke do delegado correspondente).Você deve predefinir o tipo delegate para declarar um membro gerenciado de dados do evento.Por outro lado, um método de evento gerenciado define implicitamente o delegado gerenciado correspondente se ainda não estiver definido.Consulte o exemplo de código ao final deste tópico para obter um exemplo.
Ao declarar um evento gerenciado, você pode especificar acessadores adicionar e remover que serão chamados quando manipuladores de eventos são adicionados ou removidos usando os operadores e += - =.Os métodos adicionar, remover e gerar podem ser chamados explicitamente.
As etapas a seguir devem ser recolhido ordem criar e usar eventos no Visual C++:
Crie ou identifique um delegado.Se você estiver definindo seu próprio evento, também deverá garantir que haja um delegado a ser usado com a palavra-chave event.Se o evento estiver predefinido, no .NET Framework, por exemplo, então nos consumidores de necessidade de eventos conhecerá apenas o nome do delegado.
Crie uma classe que contenha:
Um evento criado a partir do delegado.
(opcional) Um método que verifica se existe uma instância do delegado declarado com a palavra-chave event.Caso contrário, essa lógica deverá ser colocada no código que aciona o evento.
Métodos que chamam o evento.Esses métodos podem ser substituições de alguma funcionalidade de classe base.
Esta classe define o evento.
Defina uma ou mais classes que conectem métodos ao evento.Cada uma dessas classes associará um ou mais métodos ao evento na classe base.
Usar o evento:
Crie um objeto da classe que contém a declaração de evento.
Crie um objeto da classe que contém a definição de evento.
Para mais informações sobre eventos C++/CLI, consulte
Requisitos
Opção do compilador: /clr
Exemplos
Exemplo
O exemplo de código a seguir demonstra declarar pares de delegados, de eventos e de manipuladores de eventos; assinando (adicionar) os manipuladores de eventos; invocando os manipuladores de eventos e então cancelando a assinatura (removendo) os manipuladores de eventos.
// 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);
}
Saída
Exemplo
O exemplo de código a seguir demonstra a lógica usada para gerar o método raise de um evento trivial: se o evento tiver um ou mais assinantes, chamar o método raise implicitamente ou explicitamente chama o delegado.Se o tipo de retorno do delegado não for void e se não houver assinantes de eventos, o método raise retornará o valor padrão para o tipo delegado.Se não houver nenhum assinante de evento, a chamada ao método raise simplesmente retornará e nenhuma exceção será gerada.Se o tipo de retorno do delegado não for void, o tipo delegado será retornado.
// 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);
}
Saída
Consulte também
Conceitos
Extensões de componente para plataformas de tempo de execução