委托(C++ 组件扩展)

声明一个函数指针的类型。

所有运行时

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

3z2x4f55.collapse_all(zh-cn,VS.110).gif备注

delegate 是上下文相关关键字。 有关更多信息,请参见 上下文相关的关键字(C++ 组件扩展)

若要检测到编译时,如果类型是委托,请使用 __is_delegate() 类型特征。 有关更多信息,请参见 编译器支持类型特征(C++ 组件扩展)

运行时的窗口

C++/CX 支持具有以下语法的委托。

3z2x4f55.collapse_all(zh-cn,VS.110).gif语法

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

3z2x4f55.collapse_all(zh-cn,VS.110).gif参数

  • 访问
    (可选) 委托的辅助功能,可以是 public (默认值) 或 private。 函数原型也未用 const 或 volatile 关键字。

  • 返回类型
    函数原型的返回类型。

  • 委托类型标识符
    声明的委托类型的名称。

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

3z2x4f55.collapse_all(zh-cn,VS.110).gif备注

使用 委托类型标识符 声明原型与委托相同。

3z2x4f55.collapse_all(zh-cn,VS.110).gif要求

编译器选项: /ZW

公共语言运行时

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

3z2x4f55.collapse_all(zh-cn,VS.110).gif语法

access delegate function_declaration

3z2x4f55.collapse_all(zh-cn,VS.110).gif参数

  • 访问
    (可选) 委托的可访问性在程序集外部可以是公共或私有的。 默认值为私有的。 在类中,委托可以具有任何可访问性。

  • function_declaration
    可以绑定到委托函数的签名。 委托的返回类型可以是任何托管类型。 互操作性原因,建议委托的返回类型是 CLS 类型。

    若要定义一个未绑定的委托,在 function_declaration 的第一个参数应为 this 指针类型的对象的。 有关更多信息,请参见 未绑定的委托

3z2x4f55.collapse_all(zh-cn,VS.110).gif备注

委托是多路广播:“函数指针”可绑定到托管类中的一个或多个方法。 委派 关键字定义与特定方法签名的多路广播委托类型。

委托还可以绑定到值类的方法,如静态方法。

委托具有以下特征:

  • 它从 System::MulticastDelegate继承。

  • 它有一个采用两个参数的构造函数:对托管类或 NULL 的指针 (对于绑定到静态方法) 和指定类型的完全限定的方法。

  • 它没有名为 Invoke的方法,签名与委托的声明的签名。

当调用委托时,这些附加功能都按顺序调用。

委托的返回值是从其最后的附加成员函数的返回值。

无法重载委托。

委托可绑定或断开连接。

在实例化一个绑定的委托,第一个参数是对象引用。 委托实例化的第二个参数是托管类对象的方法的地址或指针指向值类型的方法。 委托实例化的第二个参数名称必须以完全的类范围语法的方法并将运算符地址。

在实例化一个未绑定的委托,第一个参数是托管类对象的方法的地址或指针指向值类型的方法。 参数名称必须以完全的类范围语法的方法并将运算符地址。

在创建委托传递给静态或全局函数时,只需要一个参数:函数 (可选,函数的地址)。

有关委托的更多信息,请参见

3z2x4f55.collapse_all(zh-cn,VS.110).gif要求

编译器选项: /clr

3z2x4f55.collapse_all(zh-cn,VS.110).gif示例

示例

下面的示例演示如何声明,初始化和调用该委托。

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

Output

  
  
  
  
  

请参见

概念

适用于运行时平台的组件扩展