__delegate
Hinweis Dieses Thema gilt nur für Version 1 von Managed Extensions für C++. Diese Syntax sollte nur verwendet werden, um Code von Version 1 beizubehalten. Informationen über die Verwendung der entsprechenden Funktionen in der neuen Syntax finden Sie unter delegate (Komponentenerweiterungen für C++).
Definiert einen Referenztyp, der verwendet werden kann, um eine Methode mit einer bestimmten Signatur zu kapseln.
__delegate function-declarator
Hinweise
Ein Delegat entspricht mit Ausnahme des folgenden Unterschieds ungefähr einem Funktionszeiger in C++:
- Ein Delegat kann an eine oder mehrere Methoden innerhalb einer __gc-Klasse gebunden werden.
Wenn der Compiler auf das __delegate-Schlüsselwort trifft, wird eine Definition einer __gc-Klasse generiert. Dieser __gc-Klasse weist folgende Merkmale auf:
Es erbt von System::MulticastDelegate.
Er verfügt über einen Konstruktor, der zwei Argumente akzeptiert: einen Zeiger auf eine __gc-Klasse oder NULL (im Fall der Bindung an eine statische Methode) und eine vollständig qualifizierte Methode des angegebenen Typs.
Er verfügt über eine Methode mit dem Namen Invoke, deren Signatur der deklarierten Signatur des Delegaten entspricht.
Beispiel
Im folgenden Beispiel werden eine __gc-Klasse (MyCalendar) und ein Delegat (GetDayOfWeek) deklariert. Der Delegat wird anschließend an die verschiedenen Methoden von MyCalendar gebunden und ruft alle nacheinander auf:
// 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)));
}
Beispielausgabe
static handler
6
static handler
handler
4