c#委托和c⼀c++指向函数的指针的区别

2024-11-08 14:19:43
推荐回答(1个)
回答1:

委托类似于 C/C++ 函数指针指向(理解代表或者储存)签名(指函数返回值及参数列表)与函数指针所指定签名相同函数
委托同之处于委托仅仅类换句说当需要实际使用委托进行操作时只能对对象(实例)进行操作;
并且委托只指向单方法多签名相同方法都被指向
并且委托类似于集合(种类似于数组东西储存容量自动增长)对注册了方法(已指向)进行解指向操作(注销)样被注销方法会被委托所使用了
委托特定于当调用委托(按照方法调用语法调用)所有绑定了该委托方法都会被按照绑定顺序调用

下面定义委托代码(无法直接使用因类):

// 函数返回值 委托类名(参数列表);
void DoSomethingInOrder(int a, int b);

了能够使用委托 DoSomethingInOrder需要实例化:

// 实例化多次每被实例化委托对象都各自拥有同被绑定方法列表
DoSomethingInOrder a;
DoSomethingInOrder b;

我们需要向委托对象 a 及 b 注册签名与些对象委托类型指定签名相同方法:

// 下两方法签名与委托 DoSomethingInOrder 所指定签名相同
void DoSomethingA(int a, int b)
{
Console.WriteLine("DoSomethingA: {0}", new Random().Next(a, b));
}

void DoSomethingB(int a, int b)
{
Console.WriteLine("来自 DoSomethingB 消息");
}

// 假设里当前代码上下位线程会被执行方法体内
a += new DoSomethingInOrder(DoSomethingA); // 通过委托类已重载 += 操作符向委托对象绑定特定方法而被绑定对象类型委托类型构造方法参数方法名
a += DoSomethingB; // 需要显式调用构造方法通过方法组语言转换直接提供方法名即绑定
b += DoSomethingA; // 委托对象 b 自己拥有方法列表
a(1, 7); // 调用委托对象并提供参数(int a, int b)
b(3, 9); // 同上

终程序输出结下(当前项目控制台应用程序):
DoSomethingA: 3
来自 DoSomethingB 消息
DoSomethingA: 8

而委托还有种特殊编程方式称协变和逆变具体去 MSDN 搜索下