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

 更新时间:2013年05月02日 12:04:30   作者:  
本篇文章介绍了,基于.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:方法指针,指向的是内存中该方法的地址;

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

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

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

相关文章

  • ASP.NET向Javascript传递变量两种实现方法

    ASP.NET向Javascript传递变量两种实现方法

    ASP.NET向Javascript传递变量两种实现方法,需要的朋友可以参考下
    2012-12-12
  • 如何给asp.net core写个简单的健康检查

    如何给asp.net core写个简单的健康检查

    这篇文章主要给大家介绍了关于如何给asp.net core写个简单的健康检查的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用asp.net core具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • C# 添加文字水印类代码

    C# 添加文字水印类代码

    可以添加文字水印的c# 类函数。
    2009-05-05
  • ASP.NET 2.0/3.5中直接操作Gridview控件插入新记录

    ASP.NET 2.0/3.5中直接操作Gridview控件插入新记录

    Gridview控件中并没有提供像在FormView和DetailsView控件中那样直接插入新记录操作的支持。
    2008-11-11
  • 谈谈对.NET中async/await的理解

    谈谈对.NET中async/await的理解

    本文介绍了.NET中异步编程的概念,包括async和await关键字的使用,以及异步编程的性能提升机制,异步编程通过非阻塞操作提高了程序执行效率,减少了主线程的等待时间,感兴趣的朋友一起看看吧
    2025-03-03
  • ASP.NET 提高首页性能的十大做法

    ASP.NET 提高首页性能的十大做法

    本文是我对ASP.NET页面载入速度提高的一些做法,这些做法分为以下部分,希望对朋友们有所帮助。
    2010-05-05
  • IIS上部署Asp.net core Webapi的实现步骤

    IIS上部署Asp.net core Webapi的实现步骤

    ASP.NET Core Web API是构建RESTful应用程序的理想平台,本文主要介绍了IIS上部署Asp.net core Webapi的实现步骤,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • Repeater控件动态变更列(Header,Item和Foot)信息实现思路

    Repeater控件动态变更列(Header,Item和Foot)信息实现思路

    需求开发一个小报表,显示最近五个月的summary的数量统计,报表会随月份的变化而变化,接下来为大家详细介绍下实现方法,感兴趣的各位不要错过了哈
    2013-03-03
  • ASP.NET MVC5网站开发文章管理架构(七)

    ASP.NET MVC5网站开发文章管理架构(七)

    继上一篇把member的用户部分完成,现在开始做文章管理部分。文章部分根据涉及显示现实文章列表,发布文章,修改和删除文章等功能。最终的实现目标是使用权限来控制用户是否能进行相应操作,管理员权限的会显示全部文章列表和我的文章列表,普通用户只显示我的文章列表
    2015-09-09
  • Asp.Net 网站优化系列之数据库优化分字诀上 分库

    Asp.Net 网站优化系列之数据库优化分字诀上 分库

    当我们的数据量很小的时候,我们会把用户表,博客表,论坛表,闪存表等等都砸在一个库里,我们的业务增长的很好,在不久之后我们尽力的优化了查询,但是效果依然不佳,这时候用分字诀的时机到了。
    2010-06-06

最新评论