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

声明表示函数指针的类型。

所有运行时

Windows 运行时和公共语言运行时都支持委托。

备注

delegate 是上下文相关关键字。 有关详细信息,请参阅上下文相关关键字

若要在编译时检测类型是否是委托,请使用 __is_delegate() 类型特征。 有关详细信息,请参阅编译器对类型特征的支持

Windows 运行时

C++/CX 支持使用以下语法的委托。

语法

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

参数

访问
(可选)委托的可访问性,可以是 public(默认值)或 private。 此外,还可以使用 constvolatile 关键字对函数原型进行限定。

return-type
函数原型的返回类型。

delegate-type-identifier
声明的委托类型的名称。

parameters
(可选)函数原型的类型和标识符。

备注

delegate-type-identifier 可用于声明与委托具有相同原型的事件。 有关详细信息,请参阅 delegate (C++/CX)

要求

编译器选项:/ZW

公共语言运行时

公共语言运行时支持使用以下语法的委托。

语法

access
delegate
function_declaration

参数

访问
(可选)程序集外部委托的可访问性可以是 public 或 private。 默认值为 private。 在类中,委托可具有任意可访问性。

function_declaration
可以绑定到委托的函数的签名。 委托的返回类型可以是任意托管类型。 出于互操作性方面的考虑,建议使用 CLS 类型作为委托的返回类型。

若要定义未绑定的委托,function_declaration 中的第一个参数应为对象的 this 指针的类型

注解

委托是多播的。也就是说,“函数指针”可以绑定到托管类中的一个或多个方法。 delegate 关键字定义了含特定方法签名的多播委托类型。

委托还可以绑定到 value class 的方法(如静态方法)。

委托有以下特征:

  • 它继承自 System::MulticastDelegate

  • 它有一个构造函数,需要使用以下两个参数:指向托管类或 NULL(在绑定到静态方法时)的指针,以及采用指定类型的完全限定方法。

  • 它具有一个称为 Invoke 的方法,其签名与委托的声明签名匹配。

在委托获得调用后,它的一个或多个函数按附加顺序进行调用。

委托的返回值是它最后一个附加成员函数的返回值。

无法重载委托。

可以绑定委托,也可以不绑定委托。

实例化绑定委托时,第一个参数应为对象引用。 委托实例化的第二个参数要么应为托管类对象的方法的地址,要么应为指向采用值类型的方法的指针。 委托实例化的第二个参数必须使用完整的类范围语法来命名方法,并应用取址器运算符。

实例化未绑定委托时,第一个参数要么应为托管类对象的方法的地址,要么应为指向采用值类型的方法的指针。 此参数必须使用完整的类范围语法来命名方法,并应用取址器运算符。

创建静态函数或全局函数的委托时,只需要一个参数,即函数(也可以视需要使用函数地址)。

若要详细了解委托,请参阅

要求

编译器选项:/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 的组件扩展