delegate(C++/CLI 和 C++/CX)
声明表示函数指针的类型。
所有运行时
Windows 运行时和公共语言运行时都支持委托。
备注
delegate 是上下文相关关键字。 有关详细信息,请参阅上下文相关关键字。
若要在编译时检测类型是否是委托,请使用 __is_delegate()
类型特征。 有关详细信息,请参阅编译器对类型特征的支持。
Windows 运行时
C++/CX 支持使用以下语法的委托。
语法
access
delegate
return-type
delegate-type-identifier
(
[ parameters ]
)
参数
访问
(可选)委托的可访问性,可以是 public
(默认值)或 private
。 此外,还可以使用 const
或 volatile
关键字对函数原型进行限定。
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