Share via


delegate (Komponentenerweiterungen für C++)

Deklariert einen Typ, der einen Funktionszeiger darstellt.

Alle Laufzeiten

Windows-Runtime und Common Language Runtime unterstützen Delegaten.

Hinweise

delegate ist ein kontextbezogenes Schlüsselwort. Weitere Informationen finden Sie unter Kontextbezogene Schlüsselwörter (Komponentenerweiterungen für C++).

Um zur Kompilierungszeit zu erkennen, ob ein Typ ein Delegat ist, verwenden Sie das __is_delegate()-Typmerkmal. Weitere Informationen finden Sie unter Compilerunterstützung für Typmerkmale (Komponentenerweiterungen für C++).

Windows-Runtime

C++/CX unterstützen Delegaten mit der folgenden Syntax.

Syntax

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

Parameter

  • access
    (optional) Der Zugriff des Delegaten, der public (Standard) oder private sein kann. Der Funktionsprototyp kann auch mit den Schlüsselwörtern const oder volatile qualifiziert werden.

  • return-type
    Der Rückgabetyp des Funktionsprototypen.

  • delegate-type-identifier
    Der Name des deklarierten Delegatentyps.

  • parameters
    (Optional) Die Typen und die Bezeichner des Funktionsprototyps.

Hinweise

Verwenden Sie delegate-type-identifier, um ein Ereignis mit dem gleichen Prototyp wie der Delegat zu deklarieren. Weitere Informationen finden Sie unter Delegaten (C++/CX).

Voraussetzungen

Compileroption: /ZW

Common Language Runtime

Die Common Language Runtime unterstützt Delegaten mit der folgenden Syntax.

Syntax

access delegate function_declaration

Parameter

  • access
    (optional) Der Zugriff des Delegaten außerhalb der Assembly kann öffentlich oder privat sein. Die Standardeinstellung ist "privat". Innerhalb einer Klasse kann ein Delegat jede Zugriffen aufweisen.

  • function_declaration
    Die Signatur der Funktion, die an den Delegaten gebunden werden kann. Der Rückgabetyp eines Delegaten kann entweder verwalteter Typ sein. Aus Kompatibilitätsgründen wird empfohlen, dass der Rückgabetyp eines Delegaten ein CLS-Typ ist.

    Um einen ungebundenen Delegaten definieren, sollte der erste Parameter in function_declaration der Typ des this Zeigers für das Objekt sein. Weitere Informationen finden Sie unter Ungebundene Delegaten.

Hinweise

Delegaten sind Multicastdelegaten: Der "Funktionszeiger" kann an eine oder mehrere Methoden innerhalb einer verwalteten Klasse gebunden werden. Das delegate-Schlüsselwort definiert einen Multicastdelegattyp mit einer bestimmten Methodensignatur.

Ein Delegat kann auch an eine Methode einer Wertklasse, wie eine statische Methode gebunden werden.

Ein Delegat weist folgende Merkmale auf:

  • Es erbt von System::MulticastDelegate.

  • Er verfügt über einen Konstruktor, der zwei Argumente akzeptiert: Ein Zeiger auf eine verwaltete Klasse oder NULL (im Fall der Bindung an eine statische Methode) und eine vollständig qualifizierte Methode des angegebenen Typs.

  • Er verfügt über eine Methode mit dem Namen Invoke, deren Signatur der deklarierten Signatur des Delegaten entspricht.

Wenn ein Delegat aufgerufen wird, werden die Funktionen in der Reihenfolge aufgerufen, in der sie angefügt wurden.

Der Rückgabewert eines Delegaten ist der Rückgabewert der zuletzt angefügten Memberfunktion.

Delegaten dürfen nicht überladen werden.

Delegaten können gebunden oder ungebunden sein.

Wenn Sie einen gebundenen Delegaten instanziieren, ist das erste Argument ein Objektverweis. Das zweite Argument einer Delegatinstanziierung ist entweder die Adresse einer Methode eines verwalteten Klassenobjekts oder ein Zeiger auf eine Methode eines Werttyps. Das zweite Argument einer Delegatinstanziierung muss die Methode mit der vollständigen Syntax des Klassenbereichs benennen und den AddressOf-Operator anwenden.

Wenn Sie einen ungebundenen Delegaten instanziieren, ist das erste Argument entweder die Adresse einer Methode eines verwalteten Klassenobjekts oder ein Zeiger auf eine Methode eines Werttyps. Das Argument muss die Methode mit der vollständigen Syntax des Klassenbereichs benennen und den AdressOf-Operator anwenden.

Wenn Sie einen Delegaten zu einer statischen oder globalen Funktion erstellen, ist nur ein Parameter erforderlich: Die Funktion (optional die Adresse der Funktion).

Weitere Informationen zu Delegaten finden Sie unter

Voraussetzungen

Compileroption: /clr

Beispiele

Beispiel

Im folgenden Beispiel wird gezeigt, wie Delegaten deklariert, initialisiert und aufgerufen werden.

// 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);
}

Ausgabe

  
  
  
  
  

Siehe auch

Konzepte

Komponentenerweiterungen für Laufzeitplattformen