__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