.net知识和学习方法系列(二十)CLR-委托

简介:
delegate void DL(int i);
上面是一个委托的定义,委托向外提供了一种回调函数的机制,在.net中的委托是类型安全的,一个委托能实现对一类方法的回调,这个统一是通过委托的参数和返回值来实现的。
上面代码如果用IL来解释,是这个样子
 
 
如果用C#来表示,一个委托就成了下面的代码
   class DL:System .MulticastDelegate
   {
       public DL(Object object,IntPtr method);
       public virtual void Invoke(Int32 i);
       public virtual IAsyncResult BeginInvoke(Int32 i,AsyncCallback callback,Object object);
       public virtual void EndInvoke(IAsyncResult result);    
   }
当然,上面代码是通不过编译的,只是对应IL代码的表现。
在上面的类中,有一个构造函数,和三个方法,同时还有三个继承至MulticastDelegate的三个非公有字段_target,_methodPtr,_invocationList。
在构造函数中有两个参数,第一个是object类型,这里指的是被回调方法的对象,如果该方法是静态的,那么这个值就是null,第二个参数是个IntPtr,这个参数是回调方法。并且在构造器中,会把object赋给_target,IntPtr赋给_methodPtr来保存。
另外一个字段_invocationList是一个存放回调方法的链表。
static void Main(string[] args)
        {
            Program p = new Program();
            DL dl = new DL(p.FF);
            dl += p.FF;
            dl += FF1;
            dl(1);
        }
        public static void FF1(int i)
        {
            Console.WriteLine("d");
        }
        public void FF(int i)
        {
            Console.WriteLine(DateTime .Now .ToString ());
        }
上面代码的+=的过程,其实就是向_invocationList添加委托的过程。
还有代码中,我们调用了dl(1),这个代码其实是dl.Invoke(1)。














本文转自桂素伟51CTO博客,原文链接: http://blog.51cto.com/axzxs/149959,如需转载请自行联系原作者



相关文章
|
1月前
|
API C++ Windows
Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法
本文介绍Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法,提供官方下载链接与系统修复工具使用指南。
509 2
|
1月前
|
人工智能 API 数据库
Semantic Kernel .NET 架构学习指南
本指南系统解析微软Semantic Kernel .NET架构,涵盖核心组件、设计模式与源码结构,结合实战路径与调试技巧,助你从入门到贡献开源,掌握AI编排开发全栈技能。
204 2
|
Java 物联网 C#
C#/.NET/.NET Core学习路线集合,学习不迷路!
C#/.NET/.NET Core学习路线集合,学习不迷路!
474 0
|
SQL 缓存 开发框架
分享一个 .NET EF6 应用二级缓存提高性能的方法
分享一个 .NET EF6 应用二级缓存提高性能的方法
165 0
学习计算机组成原理(王道考研)------第十一天https://zhengyz.blog.csdn.net/article/details/121706379?spm=1001.2014.3001.5502
这篇文章是关于计算机组成原理的王道考研学习笔记,主要介绍了半导体存储器RAM和ROM的相关知识。
学习计算机组成原理(王道考研)------第十一天https://zhengyz.blog.csdn.net/article/details/121706379?spm=1001.2014.3001.5502
|
开发框架 缓存 算法
开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践干货)
开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践干货)
808 0
|
开发框架 监控 .NET
|
程序员 数据库
分享 2 个 .NET EF 6 只更新某些字段的方法
分享 2 个 .NET EF 6 只更新某些字段的方法
311 0
|
数据库
分享一个 .NET EF 6 扩展 Where 的方法
分享一个 .NET EF 6 扩展 Where 的方法
157 0

热门文章

最新文章