__delegate
Observação neste 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 delegado (extensões de componentes C++) 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.
Sintaxe
__delegate
function-declarator
Comentários
Um delegado é aproximadamente equivalente a um ponteiro de função do C++, exceto as seguintes diferenças:
- Um delegado só pode ser associado a um ou mais métodos dentro de uma classe GC.
Quando o compilador encontra a __delegate palavra-chave, uma definição de uma classe GC é gerada. Essa classe GC tem as seguintes características:
Ele herda de System:: MulticastDelegate.
Ele tem um construtor que utiliza dois argumentos: um ponteiro para uma classe GC ou nulo (no caso de associação a um método estático) e um método totalmente qualificado do tipo especificado.
Ele 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. O delegado é então vinculado 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