Condividi tramite


__delegate

 

Pubblicato: aprile 2016

Nota   Questo argomento si applica solo alla versione 1 delle estensioni gestite per C++. Questa sintassi deve essere utilizzata solo per gestire il codice della versione 1. Vedere delegato (Estensioni del componente C++) per informazioni sull'utilizzo della funzionalità equivalente nella nuova sintassi.

Viene definito un tipo di riferimento che può essere utilizzato per incapsulare un metodo con una firma specifica.

Sintassi

__delegate 
function-declarator

Note

Un delegato equivale approssimativamente a un puntatore di funzione C++, eccezion fatta per le seguenti differenze:

  • Un delegato può essere associato a uno o più metodi solo all'interno una classe __gc.

Quando il compilatore rileva la parola chiave __delegate, viene generata una definizione di classe __gc. Tale classe __gc presenta le caratteristiche seguenti:

  • Eredita da System::MulticastDelegate.

  • Ha un costruttore che accetta due argomenti: un puntatore a una classe __gc o a NULL (nel caso di associazione ad un metodo statico) e un metodo completamente qualificato del tipo specificato.

  • Ha un metodo denominato Invoke, la cui firma corrisponde alla firma del delegato dichiarata.

Esempio

Nell'esempio seguente, una classe __gc (MyCalendar) e un delegato (GetDayOfWeek) vengono dichiarati. Il delegato viene, quindi, associato ai diversi metodi di MyCalendar, richiamandoli tutti a turno:

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

Esempio di output

static handler
6
static handler
handler
4