Partager via


__delegate

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 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.

__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