Compartilhar via


__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