.NET笔记之:Delegate内部原理的分析

 首先我们要弄清楚什么是委托?相信大家对委托并不陌生,委托其实就是一种定义方法签名的类型;有关于委托的详细介绍,大家可以参考MSDN中作出的介绍,链接为:http://msdn.microsoft.com/zh-cn/library/vstudio/ms173171.aspx。这里我就不做具体介绍了;

  这篇文章我主要是想告诉大家委托的内部到底是什么样的结构,我们先通过一个简单的demo来复习一下委托: 


代码如下:

using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;

namespace _01Delegate
 {
     //约束的指向方法的签名,也就是一个强类型的指针
     public delegate int AddDele(int a, int b);

class Program
     {
         static void Main(string[] args)
         {
             //定义一个委托变量,注意指向第一个方法的时候一定要用new关键字 后面的可以用+=
             AddDele delStatic = new AddDele(Add);
             //使用委托:静态方法的委托
             Console.WriteLine(delStatic(3, 4));

//实例方法的委托
             Program p = new Program();
             AddDele delInstance = new AddDele(p.AddInstance);
             //输出:9
             Console.WriteLine(delInstance(4, 5));

Console.ReadKey();
         }

//静态方法
         static int Add(int a, int b)
         {
             return a + b;
         }

//实例方法
         public int AddInstance(int a, int b)
         {
             return a + b;
         }
     }
 }

  上面代码中,分别使用委托对静态方法和实例方法进行调用,如果这段代码看起来还是很吃力的话,建议就我前面提供的链接好好的巩固一下委托的相关内容。

  开始重点:委托的内部构造

  委托内部可以分为三个部分:分别为_target,_methodPtr和委托链;(拿上面的demo为例)

  _target:顾名思义,就是委托的目标函数,如果是静态方法的话,_target就为null;如果是实例方法的话,_target指向的就是当前的实例,上例中delInstance的_target的值为p(Program的实例);

  _methodPtr:方法指针,指向的是内存中该方法的地址;

  委托链:通过+=操作形成的委托链,其实指向的就是一个个的方法;

  我简单的画了一张图来描述委托内部构造:(如下)

这些都是本人的一些理解,如果有错误的地方欢迎大家指出并相互讨论学习,希望这篇文章对大家理解委托有所帮助,同时也是为了提高自己而记录下自己的一点学习积累。

(0)

相关推荐

  • .NET笔记之:Delegate内部原理的分析

    首先我们要弄清楚什么是委托?相信大家对委托并不陌生,委托其实就是一种定义方法签名的类型:有关于委托的详细介绍,大家可以参考MSDN中作出的介绍,链接为:http://msdn.microsoft.com/zh-cn/library/vstudio/ms173171.aspx.这里我就不做具体介绍了: 这篇文章我主要是想告诉大家委托的内部到底是什么样的结构,我们先通过一个简单的demo来复习一下委托: 复制代码 代码如下: using System; using System.Collection

  • Smarty模板类内部原理实例分析

    本文实例讲述了Smarty模板类内部原理.分享给大家供大家参考,具体如下: 之前在学习ThinkPHP的时候,有接触到Smarty模板类,但是一直不知道其内部实现的原理,博主今天终于知道了其内部原理,其实也挺简单的,然后写了一个迷你版的Smarty模板类,对理解其内部原理有了很大的帮助. 1.迷你版Smarty类 首先上代码,最后再进行讲解. 项目结构图 MiniSmarty类代码(MiniSmarty.class.php) <?php /** * 迷你模板类 */ class MiniSmar

  • jQuery内部原理和实现方式浅析

    这段时间在学习研究jQuery源码,受益于jQuery日益发展强大,研究jQuery的大牛越来越多,学习的资料也比前两年好找了,有很多非常不错的资源,如高云的jQuery1.6.1源码分析系列.这些教程非常细致的分析了jQuery内部原理和实现方式,对学习和理解jQuery有非常大的帮助.但是个人认为很多教程对jQuery的整体结果把握不足,本人试图从整体来阐述一下jQuery的内部实现. 大家知道,调用jQuery有两种方式,一种是高级的实现,通过传递一个参数实现DOM选择,如通过$("h1″

  • Vue高级特性概念原理详细分析

    目录 1. 自定义v-model 2. $nextTick 3. slot 插槽 4. Vue 动态组件 5. Vue 异步组件 6. 使用 keep-alive 缓存组件 7. mixin 混入 1. 自定义v-model Vue中的自定义v-model指的是在自定义组件中使用v-model语法糖来实现双向绑定.在Vue中,通过v-model指令可以将表单元素的值与组件实例的数据进行双向绑定.但是对于自定义组件,如果要实现v-model的双向绑定,就需要自定义v-model的实现方式. 自定义

  • 详解Java线程池和Executor原理的分析

    详解Java线程池和Executor原理的分析 线程池作用与基本知识 在开始之前,我们先来讨论下"线程池"这个概念."线程池",顾名思义就是一个线程缓存.它是一个或者多个线程的集合,用户可以把需要执行的任务简单地扔给线程池,而不用过多的纠结与执行的细节.那么线程池有哪些作用?或者说与直接用Thread相比,有什么优势?我简单总结了以下几点: 减小线程创建和销毁带来的消耗 对于Java Thread的实现,我在前面的一篇blog中进行了分析.Java Thread与内

  • JS两种定义方式的区别、内部原理

    相信两种方式大家都用过,但未必所有人都知道其 区别,内部原理. 复制代码 代码如下: // 方式1 function func1(x,y){ // your code } // 方式2 var func2 = function(x,y){ // your code } 方式1 是典型的函数声明(Function declarations). 方式2 是函数表达式(Function expressions),将一个匿名函数赋值给一个变量.或者说方式2中创建了一个具有形参为x,y的匿名函数,然后把该

  • python爬虫Scrapy框架:媒体管道原理学习分析

    目录 一.媒体管道 1.1.媒体管道的特性 媒体管道实现了以下特性: 图像管道具有一些额外的图像处理功能: 1.2.媒体管道的设置 二.ImagesPipeline类简介 三.小案例:使用图片管道爬取百度图片 3.1.spider文件 3.2.items文件 3.3.settings文件 3.4.pipelines文件 一.媒体管道 1.1.媒体管道的特性 媒体管道实现了以下特性: 避免重新下载最近下载的媒体 指定存储位置(文件系统目录,Amazon S3 bucket,谷歌云存储bucket)

  • 建模UML用例图使用原理总结分析

    目录 用例图所包含的元素如下 1.参与者(Actor) 2.用例(Use Case) 3. 子系统(Subsystem) 4.关系 a. 关联(Association) b. 泛化(Inheritance) c. 包含(Include) d. 扩展(Extend) e. 依赖(Dependency) 5. 项目(Artifact) 6. 注释(Comment) 牢骚: 用例图主要用来描述"用户.需求.系统功能单元"之间的关系.它展示了一个外部用户能够观察到的系统功能模型图. [用途]:

  • MySQL的主从复制原理详细分析

    目录 前言 一.主从复制概念 二.读写分离的概念 三.主库和从库 1. 主库 2. 从库 四.主从复制的流程 五.主从复制效果展示 前言 在实际生产环境中,如果对mysql数据库的读和写都在一台数据库服务器中操作,无论是在安全性.高可用性,还是高并发等各个方面都是不能满足实际需求的,一般要通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力. 一.主从复制概念 主从复制是MySQL提供的基本的技术,主从复制的流程:binlog二进制日志(除了查询其他的更改相关的操作都会记录在b

  • SpringBoot自动配置特点与原理详细分析

    目录 一.SpringBoot是什么 二.SpringBoot的特点(核心功能) 三.SpringBoot的自动配置原理 1. @SpringBootApplication 2. @SpringBootConfiguration 3. @EnableAutoConfiguration 4. @ComponentScan 四.核心原理图 五.常用的Conditional注解 一.SpringBoot是什么 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Sprin

随机推荐