Partager via


__delegate

 

Publication: mars 2016

Remarque  Cette rubrique s'applique uniquement à la version 1 des extensions managées pour C++. Cette syntaxe doit être utilisée uniquement pour conserver le code de la version 1. Consultez delegate (extensions du composant C++) Pour plus d’informations sur l’utilisation de la fonctionnalité équivalente dans la nouvelle syntaxe.

Définit un type référence qui peut être utilisé pour encapsuler une méthode avec une signature spécifique.

Syntaxe

__delegate 
function-declarator

Notes

Un délégué est sensiblement équivalent à un pointeur fonction C++, à l'exception des éléments suivants :

  • Un délégué peut être lié à une ou plusieurs méthodes dans une classe __gc.

Lorsque le compilateur rencontre le mot clé __delegate, une définition de classe __gc est générée. Cette classe __gc présente caractéristiques suivantes :

  • Elle hérite de System::MulticastDelegate.

  • Elle possède un constructeur qui accepte deux arguments : un pointeur vers une classe __gc ou NULL (dans le cas d'une liaison à une méthode statique) et une méthode complète du type spécifié.

  • Elle possède une méthode appelée Invoke, dont la signature correspond à la signature déclarée du délégué.

Exemple

Dans l'exemple suivant, une classe __gc (MyCalendar) et un délégué (GetDayOfWeek) sont déclarés. Le délégué est ensuite lié aux différentes méthodes de MyCalendar, appelant chaque méthode l'une après l'autre :

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

Résultat de l'exemple

static handler
6
static handler
handler
4