Share via


__delegate

 

Veröffentlicht: Juli 2016

Hinweis   Dieses Thema gilt nur für Version 1 von Managed Extensions für C++. Diese Syntax sollte nur verwendet werden, um Code von Version 1 beizubehalten. Finden Sie unter delegate (Komponentenerweiterungen für C++) Informationen zur Verwendung der entsprechenden Funktionalität in der neuen Syntax.

Definiert einen Referenztyp, der verwendet werden kann, um eine Methode mit einer bestimmten Signatur zu kapseln.

Syntax

__delegate 
function-declarator

Hinweise

Ein Delegat entspricht mit Ausnahme des folgenden Unterschieds ungefähr einem Funktionszeiger in C++:

  • Ein Delegat kann an eine oder mehrere Methoden innerhalb einer __gc-Klasse gebunden werden.

Wenn der Compiler auf das __delegate-Schlüsselwort trifft, wird eine Definition einer __gc-Klasse generiert. Dieser __gc-Klasse weist folgende Merkmale auf:

  • Es erbt von System::MulticastDelegate.

  • Er verfügt über einen Konstruktor, der zwei Argumente akzeptiert: einen Zeiger auf eine __gc-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.

Beispiel

Im folgenden Beispiel werden eine __gc-Klasse (MyCalendar) und ein Delegat (GetDayOfWeek) deklariert. Der Delegat wird anschließend an die verschiedenen Methoden von MyCalendar gebunden und ruft alle nacheinander auf:

// keyword__delegate.cpp
// compile with: /clr:oldSyntax
#using <mscorlib.dll>
using namespace System;

__delegate int GetDayOfWeek();
__gc class MyCalendar {
public:
   MyCalendar() : m_nDayOfWeek(4) {}
   int MyGetDayOfWeek() { 
      Console::WriteLine("handler"); return m_nDayOfWeek; 
   }
   static int MyStaticGetDayOfWeek() { 
      Console::WriteLine("static handler"); 
      return 6;
   }
private:
   int m_nDayOfWeek;
};

int main () {
   GetDayOfWeek * pGetDayOfWeek;  // declare delegate type
   int nDayOfWeek;

   // bind delegate to static method
   pGetDayOfWeek = new GetDayOfWeek(0, &MyCalendar::MyStaticGetDayOfWeek);
   nDayOfWeek = pGetDayOfWeek->Invoke();
   Console::WriteLine(nDayOfWeek);

   // bind delegate to instance method
   MyCalendar * pcal = new MyCalendar();
   pGetDayOfWeek = static_cast<GetDayOfWeek*>(Delegate::Combine(pGetDayOfWeek,
      new GetDayOfWeek(pcal, &MyCalendar::MyGetDayOfWeek)));
   nDayOfWeek = pGetDayOfWeek->Invoke();
   Console::WriteLine(nDayOfWeek);

   // delegate now bound to two methods; remove instance method
   pGetDayOfWeek = static_cast<GetDayOfWeek*>(Delegate::Remove(pGetDayOfWeek,
      new GetDayOfWeek(pcal, &MyCalendar::MyGetDayOfWeek)));
}

Beispielausgabe

static handler
6
static handler
handler
4