Sdílet prostřednictvím


__delegate

 

Poznámka   Toto téma se týká pouze verze 1 spravovaných rozšíření jazyka C++. Tato syntaxe by měla sloužit pouze k udržování kódu verze 1. Viz Delegát (rozšíření komponent C++) informace o použití ekvivalentní funkce v nové syntaxi.

Definuje typ odkazu, který lze použít k zapouzdření metoda konkrétní podpisem.

Syntaxe

__delegate 
function-declarator

Poznámky

Delegát je přibližně ekvivalentem ukazatel na funkci jazyka C++ s výjimkou následujících rozdílů:

  • Delegát může vazby pouze na jednu nebo více metod v rámci třídy __gc.

Když kompilátor narazí __delegate – klíčové slovo, definice třídy __gc, je vygenerována. Tato třída __gc má následující vlastnosti:

  • Dědí z System::MulticastDelegate.

  • Má konstruktor, který přijímá dva argumenty: ukazatel na třídu __gc nebo NULL (v případě vazby ke statickou metodu) a plně kvalifikovaný metoda zadaného typu.

  • Má metodu s názvem Invoke, jehož předpis odpovídá deklarované signaturu delegáta.

Příklad

V následujícím příkladu třída __gc (MyCalendar) a delegáta (GetDayOfWeek) jsou deklarovány. Delegát je potom svázáno s různými způsoby MyCalendar, každý zase vyvolání:

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

Vzorový výstup

static handler
6
static handler
handler
4