__delegate
Observação Este tópico se aplica somente à versão 1 de Managed Extensions for C++. Esta sintaxe só deve ser usada para manter o código da versão 1. Consulte Delegar para obter informações sobre como usar a funcionalidade equivalente na nova sintaxe.
Define um tipo de referência que pode ser usado para encapsular um método com uma assinatura específica.
__delegate function-declarator
Comentários
Um delegado é, em termos gerais, equivalente a um ponteiro de função do C++, exceto pelas seguintes diferenças:
- Um delegado só pode ser associado a um ou mais métodos em uma classe __gc.
Quando o compilador encontra a palavra-chave __delegate, uma definição de uma classe __gc é gerada. Essa classe __gc tem as seguintes características:
Herda de System::MulticastDelegate.
Tem um construtor que utiliza dois argumentos: um ponteiro para uma classe __gc ou NULL (no caso de associação a um método estático) e um método totalmente qualificado do tipo especificado.
Tem um método chamado Invoke, cuja assinatura corresponde à assinatura declarada do delegado.
Exemplo
No exemplo a seguir, uma classe __gc (MyCalendar) e um delegado (GetDayOfWeek) são declarados. Em seguida, o delegado é associado aos diferentes métodos de MyCalendar, invocando um de cada vez:
// keyword__delegate.cpp
// compile with: /clr:oldSyntax
#using <mscorlib.dll>
using namespace System;
__delegate int GetDayOfWeek();
__gc class MyCalendar {
public:
MyCalendar() : m_nDayOfWeek(4) {}
int MyGetDayOfWeek() {
Console::WriteLine("handler"); return m_nDayOfWeek;
}
static int MyStaticGetDayOfWeek() {
Console::WriteLine("static handler");
return 6;
}
private:
int m_nDayOfWeek;
};
int main () {
GetDayOfWeek * pGetDayOfWeek; // declare delegate type
int nDayOfWeek;
// bind delegate to static method
pGetDayOfWeek = new GetDayOfWeek(0, &MyCalendar::MyStaticGetDayOfWeek);
nDayOfWeek = pGetDayOfWeek->Invoke();
Console::WriteLine(nDayOfWeek);
// bind delegate to instance method
MyCalendar * pcal = new MyCalendar();
pGetDayOfWeek = static_cast<GetDayOfWeek*>(Delegate::Combine(pGetDayOfWeek,
new GetDayOfWeek(pcal, &MyCalendar::MyGetDayOfWeek)));
nDayOfWeek = pGetDayOfWeek->Invoke();
Console::WriteLine(nDayOfWeek);
// delegate now bound to two methods; remove instance method
pGetDayOfWeek = static_cast<GetDayOfWeek*>(Delegate::Remove(pGetDayOfWeek,
new GetDayOfWeek(pcal, &MyCalendar::MyGetDayOfWeek)));
}
Saída de Exemplo
static handler
6
static handler
handler
4