delegate (C++/CLI и C++/CX)

Объявляет тип, представляющий указатель на функцию.

Все среды выполнения

Среда выполнения Windows, как и среда CLR, поддерживает делегаты.

Замечания

delegate — контекстно-зависимое ключевое слово. Дополнительные сведения см. в статье Context-Sensitive Keywords (C++/CLI and C++/CX) (Контекстно-зависимые ключевые слова (C++/CLI и C++/CX)).

Используйте признак типа __is_delegate() для определения во время компиляции является ли тип делегатом. Дополнительные сведения см. в статье Compiler Support for Type Traits (C++/CLI and C++/CX) (Поддержка признаков типов компилятором (C++/CLI и C++/CX)).

Среда выполнения Windows

C++/CX поддерживает делегаты со следующим синтаксисом.

Синтаксис

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

Параметры

access
(необязательно) Специальные возможности делегата, который может быть public (по умолчанию) или private. Прототип функции также может быть квалифицирован с помощью const или volatile ключевое слово.

return-type
Тип возвращаемого значения прототипа функции.

delegate-type-identifier
Имя объявленного типа делегата.

parameters
Типы и идентификаторы прототипа функции (необязательно).

Замечания

Используйте параметр delegate-type-identifier для объявления события с таким же прототипом, что и у делегата. Дополнительные сведения см. в статье Delegates (C++/CX) (Делегаты (C++/CX)).

Требования

Параметр компилятора: /ZW

Среда CLR

Среда CLR поддерживает делегаты со следующим синтаксисом.

Синтаксис

access
delegate
function_declaration

Параметры

access
Доступность делегата за пределами сборки может быть public или private (необязательно). По умолчанию — private. Внутри класса делегат может иметь любой уровень доступа.

function_declaration
Сигнатура функции, которую можно привязать к делегату. Типом возвращаемого значения делегата может быть любой управляемый тип. По соображениям взаимодействия рекомендуется, чтобы тип возвращаемого значения делегата был типом CLS.

Чтобы определить несвязанный делегат, первый параметр в function_declaration должен быть типом this указателя для объекта.

Замечания

Делегаты являются многоадресной рассылкой: "указатель функции" можно привязать к одному или нескольким методам в управляемом классе. Ключевое слово delegate определяет тип делегата многоадресной рассылки с помощью сигнатуры определенного метода.

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

Делегат имеет следующие характеристики.

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

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

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

При обращении к делегату его функции вызываются в порядке, в котором они были присоединены.

Возвращаемое значение делегата — это возвращаемое значение из его последней присоединенной функции-члена.

Делегаты не могут быть перегружены.

Делегаты можно привязать или отменить их привязку.

При создании экземпляра привязанного делегата первый аргумент должен быть ссылкой на объект. Второй аргумент созданного экземпляра делегата должен быть или адресом метода объекта управляемого класса, или указателем на метод типа значения. Второй аргумент созданного экземпляра делегата должен присвоить имя методу с помощью полного синтаксиса области класса и применить оператор address-of.

При создании экземпляра непривязанного делегата первый аргумент должен быть или адресом метода объекта управляемого класса, или указателем на метод типа значения. Аргумент должен присвоить имя методу с помощью полного синтаксиса области класса и применить оператор address-of.

При создании делегата статической или глобальной функции необходим только один параметр: функция (при необходимости адрес функции).

Дополнительные сведения о делегатах см. в следующих статьях.

Требования

Параметр компилятора: /clr

Примеры

В следующем примере показано, как объявить, инициализировать и вызвать делегаты.

// 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

См. также

Расширения компонентов для .NET и UWP