C#委托内部实现
2019-04-21 本文已影响0人
Memoyu
认知尚浅,如有错误,愿闻其详!
我们先看以下的代码,代码中实现了多播委托:
静态方法委托:
AddDel addDel = new AddDel(AddStaticFunc);//定义委托类型实例,该实例指向AddStaticFunc方法
实例方法委托:
Program program = new Program();
addDel += program.AddInstanceFunc;//多播委托指向一个实例方法
addDel += program.AddInstanceFunc1;
PS:多播委托的时候,如果有返回值,拿到委托返回值是最后一个委托指向的方法执行返回的值。
代码
using System;
namespace DelegateDemo
{
class Program
{
delegate int AddDel(int a, int b);//定义委托实例
static void Main(string[] args)
{
AddDel addDel = new AddDel(AddStaticFunc);//定义委托类型实例,该实例指向AddStaticFunc方法
Program program = new Program();
addDel += program.AddInstanceFunc;//多播委托指向一个实例方法
addDel += program.AddInstanceFunc1;
int result = addDel(3, 4);
///////////////////////////////
///多播委托的时候,拿到委托返回值是最后一个委托指向的方法执行返回的值。
///////////////////////////////
Console.WriteLine(result);
}
/// <summary>
/// 委托类型指向的静态方法
/// </summary>
static int AddStaticFunc(int a, int b)
{
return a + b;
}
/// <summary>
/// 委托类型指向的实例方法
/// </summary>
public int AddInstanceFunc(int a,int b)
{
return a + b + 1;
}
public int AddInstanceFunc1(int a, int b)
{
return a + b + 2;
}
}
}
由代码我们可以得出如下这张委托内部实现图:
可以看出,每个委托对象实例都分配有三块地址,分别为:
_methodPtr:存放当前委托指向的方法的内存地址。
_target:存放目标对象(委托指向方法所属的实例对象)的内存地址,静态方法时为null。
委托链(委托数组):存放多播委托的多个委托对象实例内存地址。只有第一个委托才有委托链,委托链中的委托对象实例的委托链均为null。
执行顺序为执行第一个委托指向方法,然后按委托链(委托数组)中的下标顺序执行每个委托对象实例指向的方法,如有返回值,则返回多播委托最后一个委托方法执行返回的值。