Udostępnij za pośrednictwem


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

Deklaruje typ reprezentujący wskaźnik funkcji.

Wszystkie środowiska wykonawcze

Zarówno środowisko wykonawcze systemu Windows, jak i środowisko uruchomieniowe języka wspólnego obsługują delegatów.

Uwagi

delegate to kontekstowe słowo kluczowe. Aby uzyskać więcej informacji, zobacz Kontekstowe słowa kluczowe.

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

Środowisko wykonawcze systemu Windows

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

Składnia

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

Parametry

dostęp
(opcjonalnie) Dostępność delegata, który może być public (wartość domyślna) lub private. Prototyp funkcji można również zakwalifikować za pomocą const słów kluczowych lub volatile .

zwracany typ
Zwracany typ prototypu funkcji.

identyfikator typu delegata
Nazwa zadeklarowanego typu delegata.

parameters
(Opcjonalnie) Typy i identyfikatory prototypu funkcji.

Uwagi

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

Wymagania

Opcja kompilatora: /ZW

środowiska uruchomieniowe w trakcie wykonania

Środowisko uruchomieniowe języka wspólnego obsługuje delegatów z następującą składnią.

Składnia

access
delegate
function_declaration

Parametry

dostęp
(opcjonalnie) Dostępność delegata poza zestawem może być publiczna lub prywatna. Wartość domyślna to prywatna. Wewnątrz klasy delegat może mieć dostęp do dowolnych ułatwień dostępu.

function_declaration
Podpis funkcji, która może być powiązana z pełnomocnikem. Zwracany typ delegata może być dowolnym typem zarządzanym. Ze względów współdziałania zaleca się, aby zwracany typ delegata był typem CLS.

Aby zdefiniować delegata bez ruchu przychodzącego, pierwszy parametr w function_declaration powinien być typem this wskaźnika dla obiektu.

Uwagi

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

Delegat może być również powiązany z metodą klasy wartości, taką jak metoda statyczna.

Delegat ma następujące cechy:

  • Dziedziczy System::MulticastDelegatez elementu .

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

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

Po wywołaniu delegata jego funkcje są wywoływane w kolejności, w której zostały dołączone.

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

Delegatów nie można przeciążyć.

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

Podczas tworzenia wystąpienia pełnomocnika powiązanego pierwszy argument będzie odwołaniem do obiektu. Drugim argumentem wystąpienia delegata jest adres metody obiektu klasy zarządzanej lub wskaźnik do metody typu wartości. Drugi argument wystąpienia delegata musi nazwać metodę składnią pełnego zakresu klasy i zastosować operator address-of.

Podczas tworzenia wystąpienia delegata bez ruchu przychodzącego pierwszy argument będzie adresem metody obiektu klasy zarządzanej lub wskaźnikiem metody typu wartości. Argument musi nazwać metodę składnią zakresu pełnej klasy i zastosować operator address-of.

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

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

Wymagania

Opcja kompilatora: /clr

Przykłady

W poniższym przykładzie pokazano, 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 platformy .NET i platformy uniwersalnej systemu Windows