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

    }
}

由代码我们可以得出如下这张委托内部实现图:

委托的内部构造.png
可以看出,每个委托对象实例都分配有三块地址,分别为:
_methodPtr:存放当前委托指向的方法的内存地址。
_target:存放目标对象(委托指向方法所属的实例对象)的内存地址,静态方法时为null。
委托链(委托数组):存放多播委托的多个委托对象实例内存地址。只有第一个委托才有委托链,委托链中的委托对象实例的委托链均为null。
执行顺序为执行第一个委托指向方法,然后按委托链(委托数组)中的下标顺序执行每个委托对象实例指向的方法,如有返回值,则返回多播委托最后一个委托方法执行返回的值
上一篇下一篇

猜你喜欢

热点阅读