delegat (C++/CLI i C++/CX)

Deklaruje typ, który reprezentuje wskaźnik funkcji.

Wszystkie środowiska wykonawcze

Zarówno Delegaty środowisko wykonawcze systemu Windows, jak i środowisko uruchomieniowe języka wspólnego.

Uwagi

Delegat jest kontekstowym słowem kluczowym. Aby uzyskać więcej informacji, zobacz kontekstowe słowa kluczowe.

Aby wykryć w czasie kompilacji, jeśli typ jest delegatem, użyj __is_delegate() cechy typu. Aby uzyskać więcej informacji, zobacz Obsługa kompilatora dla cech typu.

Środowisko wykonawcze systemu Windows

C++/CX obsługuje delegatów z następującą składnią.

Składnia

access
delegate
return-type
delegate-type-identifier
(
[ parameters ]
)

Parametry

niego
obowiązkowe Dostępność delegata, który może być public (wartość domyślna) lub private . Prototyp funkcji może być również kwalifikowana za pomocą const volatile słowa kluczowego or.

Typ zwracany
Zwracany typ prototypu funkcji.

delegat-Type-Identifier
Nazwa zadeklarowanego typu delegata.

wejściowe
Obowiązkowe Typy i identyfikatory prototypu funkcji.

Uwagi

Użyj identyfikatora delegata-Type , aby zadeklarować zdarzenie z tym samym prototypem co delegat. Aby uzyskać więcej informacji, zobacz delegats (C++/CX).

Wymagania

Opcja kompilatora: /ZW

środowiska uruchomieniowe w trakcie wykonania

Środowisko uruchomieniowe języka wspólnego obsługuje delegatów z poniższą składnią.

Składnia

access
delegate
function_declaration

Parametry

niego
obowiązkowe Dostępność delegata poza zestawem może być publiczna lub prywatna. Wartość domyślna to Private. W obrębie klasy delegat może mieć dowolny ułatwienia dostępu.

function_declaration
Sygnatura funkcji, która może być powiązana z delegatem. Typem zwracanym delegata może być dowolny typ zarządzany. Ze względu na współdziałanie zaleca się, aby zwracany typ delegata był typem CLS.

Aby zdefiniować niepowiązanego delegata, pierwszy parametr w function_declaration powinien być typem this wskaźnika dla obiektu.

Uwagi

Delegaty są multiemisją: "wskaźnik funkcji" może być powiązany z jedną lub wieloma metodami w klasie zarządzanej. Słowo kluczowe Delegate definiuje typ delegata multiemisji z określonym podpisem metody.

Delegat można także powiązać z metodą klasy wartości, taką jak metoda statyczna.

Delegat ma następującą charakterystykę:

  • Dziedziczy po System::MulticastDelegate .

  • Ma konstruktora, który przyjmuje dwa argumenty: wskaźnik do zarządzanej klasy lub wartość NULL (w przypadku powiązania z metodą statyczną) oraz w pełni kwalifikowaną metodę określonego typu.

  • Ma metodę o nazwie Invoke , której sygnatura jest zgodna z zadeklarowanym podpisem delegata.

Gdy obiekt delegowany jest wywoływany, jego funkcje są wywoływane w kolejności, w jakiej zostały dołączone.

Zwracana wartość delegata jest wartością zwracaną z ostatniej dołączonej funkcji członkowskiej.

Delegaty nie mogą być przeciążone.

Delegaty mogą być powiązane lub niepowiązane.

Podczas tworzenia wystąpienia powiązanego delegata pierwszy argument musi być odwołaniem do obiektu. Drugi argument tworzenia wystąpienia delegata musi być adresem metody obiektu klasy zarządzanej lub wskaźnikiem do metody typu wartości. Drugi argument tworzenia wystąpienia delegata musi mieć nazwę metody z pełną składnią zakresu klasy i zastosować operator address-of.

Podczas tworzenia wystąpienia niepowiązanego delegata pierwszy argument musi być adresem metody obiektu klasy zarządzanej lub wskaźnikiem do metody typu wartości. Argument musi mieć nazwę metody z pełną składnią zakresu klasy i zastosować operator address-of.

Podczas tworzenia delegata do funkcji statycznej lub globalnej jest wymagany tylko jeden parametr: Funkcja (opcjonalnie adres funkcji).

Aby uzyskać więcej informacji na temat delegatów, zobacz

Wymagania

Opcja kompilatora: /clr

Przykłady

Poniższy przykład pokazuje, jak zadeklarować, zainicjować i wywołać delegatów.

// 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

Zobacz też

Rozszerzenia składników dla platform .NET i platformy UWP