美文网首页
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#委托内部实现

    认知尚浅,如有错误,愿闻其详! 我们先看以下的代码,代码中实现了多播委托:静态方法委托: 实例方法委托: PS:多...

  • C# 内部委托方式 外部类实现方法

    想在页面逻辑中定义方法 ,在页面中实现方法 因为需要调用页面控件 。定义一个C#的内部委托方式 内部定义方法 外部...

  • C# 高级语言总结

    后续 1 C# 委托 委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 ...

  • C# 委托

    C#委托 C#中的委托(Delegate)类似于C或C++中函数的指针。委托(Delegate)是存有对某个方法的...

  • java8 lambda-2-各类语言中的lambda

    C/C++:函数指针 C#:委托 java之前:接口参数,实际传入匿名对象(匿名内部类) lamda表达式是Jav...

  • 教小明学一点点编程—C#篇(0)

    像小明这样使用C#的新同学,一定都会被C#的复杂的委托事件机制所困惑,那么我们不如解释一下什么是C#中委托。 委托...

  • C#多线程

    C#多线程 一多线程的几种方式 统一用于测试的模拟下载代码 1:委托创建线程实现异步 实例1:Action委托创建...

  • C#委托 匿名函数 Lambda

    C# 中委托的发展#在 C# 1.0 中,通过使用在代码中其他位置定义的方法显式初始化委托来创建委托的实例。 C#...

  • 2020-02-19

    C# 委托 (一)—— 委托、 泛型委托与Lambda表达式 原创wnvalentin 最后发布于2018-08-...

  • 11.1学习总结

    今天回顾了委托,学习了事件。 事件是类在发生被关注的事情时用来提供通知的一种方式。 在C#中使用委托模型来实现事件...

网友评论

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

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