__delegate
Poznámka Toto téma se týká pouze verze 1 spravovaných rozšíření jazyka C++. Tato syntaxe by měla sloužit pouze k udržování kódu verze 1. Viz Delegát (rozšíření komponent C++) informace o použití ekvivalentní funkce v nové syntaxi.
Definuje typ odkazu, který lze použít k zapouzdření metoda konkrétní podpisem.
Syntaxe
__delegate
function-declarator
Poznámky
Delegát je přibližně ekvivalentem ukazatel na funkci jazyka C++ s výjimkou následujících rozdílů:
- Delegát může vazby pouze na jednu nebo více metod v rámci třídy __gc.
Když kompilátor narazí __delegate – klíčové slovo, definice třídy __gc, je vygenerována. Tato třída __gc má následující vlastnosti:
Dědí z System::MulticastDelegate.
Má konstruktor, který přijímá dva argumenty: ukazatel na třídu __gc nebo NULL (v případě vazby ke statickou metodu) a plně kvalifikovaný metoda zadaného typu.
Má metodu s názvem Invoke, jehož předpis odpovídá deklarované signaturu delegáta.
Příklad
V následujícím příkladu třída __gc (MyCalendar) a delegáta (GetDayOfWeek) jsou deklarovány. Delegát je potom svázáno s různými způsoby MyCalendar, každý zase vyvolání:
// 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)));
}
Vzorový výstup
static handler
6
static handler
handler
4