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á Invokemetodu, 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

Viz také

Přípony komponent pro .NET a UPW