__delegate

Примечание   Этот раздел относится только к версии 1 статьи "Управляемые расширения для C++". Приведенный здесь синтаксис должен использоваться только для обслуживания кода версия 1. Сведения об использовании аналогичных функциональных возможностей в новом синтаксисе см. в разделе delegate.

Определяет ссылочный тип, который можно использовать для инкапсуляции метода с помощью определенной сигнатуры.

__delegate function-declarator

Заметки

Делегат приблизительно эквивалентен указателю на функцию C++ за исключением следующих различий.

  • Делегат можно привязать только к одному или нескольким методам в классе __gc.

Когда компилятор обнаруживает ключевое слово __delegate, создается определение класса __gc. Класс __gc имеет следующие характеристики.

  • Он наследуется от System::MulticastDelegate.

  • Он имеет конструктор, который принимает два аргумента: указатель на класс __gc или NULL (в случае привязки к статическому методу) и полный метод указанного типа.

  • Он содержит метод Invoke, сигнатура которого соответствует объявленной сигнатуре делегата.

Пример

В следующем примере объявляются класс __gc (MyCalendar) и делегат (GetDayOfWeek). Делегат затем привязывается к различным методам MyCalendar, вызывая каждый из них по очереди.

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

Пример результатов выполнения

static handler
6
static handler
handler
4