delegate (C++/CLI a C++/CX)
Deklaruje typ, který představuje ukazatel funkce.
Všechny moduly runtime
Delegáty podporují prostředí Windows Runtime i modul CLR (Common Language Runtime).
Poznámky
delegát je klíčové slovo citlivé na kontext. Další informace najdete v tématu Klíčová slova citlivá na kontext.
Chcete-li zjistit v době kompilace, pokud je typ delegátem, použijte __is_delegate()
vlastnost typu. Další informace naleznete v tématu Podpora kompilátoru pro vlastnosti typu.
prostředí Windows Runtime
C++/CX podporuje delegáty s následující syntaxí.
Syntaxe
access
delegate
return-type
delegate-type-identifier
(
[ parameters ]
)
Parametry
přístup
(volitelné) Přístupnost delegáta, který může být public
(výchozí) nebo private
. Prototyp funkce může být také kvalifikovaný pomocí const
klíčových slov.volatile
return-type
Návratový typ prototypu funkce.
delegate-type-identifier
Název deklarovaného typu delegáta.
parameters
(Volitelné) Typy a identifikátory prototypu funkce.
Poznámky
Pomocí identifikátoru typu delegát deklarujte událost se stejným prototypem jako delegát. Další informace najdete v tématu Delegáti (C++/CX).
Požadavky
Možnost kompilátoru: /ZW
CLR (Common Language Runtime)
Common Language Runtime podporuje delegáty s následující syntaxí.
Syntaxe
access
delegate
function_declaration
Parametry
přístup
(volitelné) Přístupnost delegáta mimo sestavení může být veřejná nebo soukromá. Výchozí hodnota je soukromá. V rámci třídy může mít delegát jakoukoli přístupnost.
function_declaration
Podpis funkce, která může být vázána na delegáta. Návratový typ delegáta může být libovolný spravovaný typ. Z důvodů interoperability se doporučuje, aby návratový typ delegáta byl typem CLS.
Chcete-li definovat nevázaný delegát, první parametr v function_declaration by měl být typem this
ukazatele objektu.
Poznámky
Delegáti jsou vícesměrové vysílání: Ukazatel funkce může být vázán na jednu nebo více metod v rámci spravované třídy. Klíčové slovo delegáta definuje typ delegáta vícesměrového vysílání s konkrétním podpisem metody.
Delegát může být také vázán na metodu třídy hodnot, jako je statická metoda.
Delegát má následující charakteristiky:
Dědí z
System::MulticastDelegate
.Má konstruktor, který přebírá dva argumenty: ukazatel na spravovanou třídu nebo HODNOTU NULL (v případě vazby na statickou metodu) a plně kvalifikovanou metodu zadaného typu.
Má volá
Invoke
metodu, jejíž podpis odpovídá deklarovanému podpisu delegáta.
Při vyvolání delegáta se jeho funkce volají v pořadí, v jakém byly připojeny.
Návratová hodnota delegáta je návratová hodnota z poslední připojené členské funkce.
Delegáty nelze přetížit.
Delegáti můžou být svázaní nebo nevázaní.
Při vytváření instance vázaného delegáta musí být prvním argumentem odkaz na objekt. Druhým argumentem instance delegáta musí být buď adresa metody spravované třídy objektu, nebo ukazatel na metodu typu hodnoty. Druhý argument instance delegáta musí pojmenovat metodu s úplnou syntaxí oboru třídy a použít adresu operátoru.
Při vytváření instance nevázaného delegáta musí být první argument buď adresa metody spravované třídy objektu, nebo ukazatel na metodu typu hodnoty. Argument musí pojmenovat metodu se syntaxí oboru celé třídy a použít operátor address-of.
Při vytváření delegáta na statickou nebo globální funkci je vyžadován pouze jeden parametr: funkce (volitelně adresa funkce).
Další informace o delegátech najdete v tématu
Požadavky
Možnost kompilátoru: /clr
Příklady
Následující příklad ukazuje, jak deklarovat, inicializovat a vyvolat delegáty.
// mcppv2_delegate.cpp
// compile with: /clr
using namespace System;
// declare a delegate
public delegate void MyDel(int i);
ref class A {
public:
void func1(int i) {
Console::WriteLine("in func1 {0}", i);
}
void func2(int i) {
Console::WriteLine("in func2 {0}", i);
}
static void func3(int i) {
Console::WriteLine("in static func3 {0}", i);
}
};
int main () {
A ^ a = gcnew A;
// declare a delegate instance
MyDel^ DelInst;
// test if delegate is initialized
if (DelInst)
DelInst(7);
// assigning to delegate
DelInst = gcnew MyDel(a, &A::func1);
// invoke delegate
if (DelInst)
DelInst(8);
// add a function
DelInst += gcnew MyDel(a, &A::func2);
DelInst(9);
// remove a function
DelInst -= gcnew MyDel(a, &A::func1);
// invoke delegate with Invoke
DelInst->Invoke(10);
// make delegate to static function
MyDel ^ StaticDelInst = gcnew MyDel(&A::func3);
StaticDelInst(11);
}
in func1 8
in func1 9
in func2 9
in func2 10
in static func3 11