美文网首页
C#委托内部实现

C#委托内部实现

作者: Memoyu | 来源:发表于2019-04-21 13:19 被阅读0次

    认知尚浅,如有错误,愿闻其详!

    我们先看以下的代码,代码中实现了多播委托:
    静态方法委托:

      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。
    执行顺序为执行第一个委托指向方法,然后按委托链(委托数组)中的下标顺序执行每个委托对象实例指向的方法,如有返回值,则返回多播委托最后一个委托方法执行返回的值

    相关文章

      网友评论

          本文标题:C#委托内部实现

          本文链接:https://www.haomeiwen.com/subject/tggdgqtx.html