相关文章导航
Sql Server2005 Transact-SQL 新兵器学习总结之-总结
Flex,Fms3相关文章索引
FlexAir开源版-全球免费多人视频聊天室,免费网络远程多人视频会议系统((Flex,Fms3联合开发))<视频聊天,会议开发实例8>
先定义一个委托如下:
public delegate void myEventHandler(int i,out string o);
再用MSIL反汇编程序(Ildasm.exe)来观看反汇编代码
其实CLR为我们做了4件事情
1.定义一个构造器
2.定义一个虚方法BeginInvoke
3.定义一个虚方法EndInvoke
4.定义一个虚方法Invoke
(1)在反汇编代码中我看到如下片断:
.class auto ansi sealed nested public myEventHandler
extends [mscorlib]System.MulticastDelegate
{
} // end of class myEventHandler
由此可以知道其实我们声明的委托myEventHandler就是一个密封类
它的父类是System.MulticastDelegate
看到这里,我的一个疑惑被解除了
以前我也自己定义过委托,总是感觉好像在程序中到处都可以定义委托,在类里面和类的外部都可以定义,一直不知道为什么?
现在我基本明白了,其实委托是一个类,类可以在哪里定义,委托就可以在哪里定义。
(2)我们现在再来看看构造器
在这之前,有必要搞清楚委托的继承关系
System.Delegate
---System.MulticastDelegate
------ConsoleApplication1.myEventHandler
现在我们实例化一个委托:
myEventHandler my=new myEventHandler(staticCall);
实际上它是在调用这个委托的构造器
下面的是这个构造器的代码:
public myEventHandler(object @object, IntPtr method);
第一个参数应该是类实例的实例
第二个参数应该是委托的方法信息
这个构造器会再调用它父类的构造器,父类构造器代码如下:
protected MulticastDelegate(object target, string method) : base(target, method)
{
}
最终调用的是System.Delegate的构造器
protected Delegate(object target, string method)
这个构造器是对类System.Delegate的2个私有字段进行处理
private object _target;
private RuntimeMethodInfo _method;
System.Delegate类有2个公有属性可以得到上述2个私有字段的数值:
1.Method 
获取委托所表示的方法 
2.Target 
获取类实例,当前委托将对其调用实例方法 
如果是静态方法,则为空引用
费话少说,我们来段代码看看效果
建立一个我最爱的控制台程序,代码如下:
1using System;
2using System.Reflection;
3
4namespace ConsoleApplication1
5{
6    class Class1
7    {
8        public delegate void myEventHandler(int i,out string o);
9        /// <summary>
10        /// 应用程序的主入口点。
11        /// </summary>
12        [STAThread]
13        static void Main(string[] args)
14        {
15            Class1 c=new Class1();
16            myEventHandler my=new myEventHandler(staticCall);
17
18            if (my.Target==null)
19            {
20                Console.WriteLine("我们调用的类静态方法");
21            }
22            else
23            {
24                Console.WriteLine("我们调用的类实例名称为:"+my.Target.ToString());
25            }
26            
27            MemberInfo info=my.Method;
28            
29            Console.WriteLine("此方法的基本信息:"+ my.Method.ToString() );
30            Console.WriteLine( my.Method.IsStatic?"此方法是一个静态方法":"此方法是一个实例方法" );
31            Console.WriteLine( "此方法的名称为:"+info.Name );
32
33            Console.ReadLine();
34        }
35
36        public void call(int i,out string o)
37        {
38            o="haha";
39        }
40
41        
42        public static void staticCall(int i,out string o)
43        {
44            o="haha";
45        }
46    }
47}
48
我们可以看到结果
要是把代码中16行替换为
myEventHandler my=new myEventHandler(c.call);
我们可以看到结果
(3)再来看看委托的虚方法BeginInvoke和虚方法EndInvoke
它的代码原型如下:
public virtual IAsyncResult BeginInvoke(int i, out string o, AsyncCallback callback, object @object);
public virtual void EndInvoke(out string o, IAsyncResult result);
BeginInvoke 异步方法签名的规则是: 
包括所有 IN 参数。 
包括所有 OUT 参数。 
包括所有 IN/OUT 参数。 
包括所有 ByRef 参数。 
将 AsyncCallback 和 AsyncState(可通过 IAsyncResult 接口的 AsyncState 属性获得)作为最后两个参数。 
返回 IAsyncResult
EndInvoke 异步方法签名的规则是: 
包括所有 IN/OUT 参数。 
包括所有 OUT 参数。 
包括所有 ByRef 参数。 
将 IAsyncResult 作为最后一个参数。
这2个方法提供了委托的异步编程方法支持。
(4)再来看看委托的方法Invoke
它的签名和委托的签名是一样的,实际上是委托的同步编程方法.
实际上是通过它来回调我们委托的方法。
我知道在异步编程中,我们可以利用委托实例直接调用BeginInvoke和EndInvoke方法
那为什么在同步编成中,VS2003不允许我们直接在程序中调用Invoke方法?
一直没明白这个问题,WHY?
vs2005可以允许我们直接在程序中调用Invoke方法
关于这4个方法的详细应用可以看这篇文章
还有一个疑问:
我用Reflector(版本是4.1)看到的Invoke方法如下:
public override void Invoke(int i, out string o);
它是一个重写的方法
而我用ildasm.exe看到Invoke方法却是virtual的
其实我更相信后者
因为我查看了myEventHandler的父类中好像没有定义Invoke方法
不知道,大家有什么看法?
author:aierong
blog:http://www.cnblogs.com/aierong
http://aierong.cnblogs.com 
Sql Server2005 Transact-SQL 新兵器学习总结之-总结 
MS SQL数据库备份和恢复存储过程(加强版本) 
sql server中分布式查询随笔(链接服务器(sp_addlinkedserver)和远程登录映射(sp_addlinkedsrvlogin)使用小总结) 
ASP.NET2.0国际化/本地化应用程序的实现总结(多语言,多文化页面的实现) 
WAP开发资料站(最新更新) 
自定义格式字符串随笔 (IFormattable,IFormatProvider,ICustomFormatter三接口的实现) 
Mcad学习笔记之异步编程(AsyncCallback 委托,IAsyncResult接口,BeginInvoke方法,EndInvoke方法的使用小总结) 
Mcad学习笔记之通过反射调用類的方法,屬性,字段,索引器(2種方法) 
Mcad学习笔记之序列化(2进制和Soap序列化) 
Mcad学习笔记之委托再理解(delegate的构造器,BeginInvoke,EndInvoke,Invoke4个方法的探讨) 
WinForm开发,窗体显示和窗体传值相关知识总结 
Mcad学习笔记之Microsoft Windows服务 
copy某目錄下的所有的目錄和文件到目的目錄(目錄數據備份) 
ASP.NET状态管理之一(概括篇)
收藏与分享
收藏到QQ书签 添加到百度搜藏 添加到百度搜藏 添加到雅虎收藏 分享到饭否 收藏到就喜欢网络收藏夹 
RSS订阅我 什么是RSS?
feedsky    http://wap.feedsky.com/aierongrss    E-mail 
订阅到雅蛙        使用RSS邮天下订阅    订阅到有道阅读 
订阅到抓虾    鲜果阅读器订阅图标    Add to Google 
訂閱 Bloglines    哪吒提醒    Subscribe in NewsGator Online
东莞.net俱乐部
东莞.net俱乐部 欢迎您的加入
我的系列文章
A.Sql Server2005 Transact-SQL 新兵器学习 
B.MCAD学习 
C.代码阅读总结 
D.ASP.NET状态管理 
E.DB(数据库) 
F.WAP 
G.WinForm 
H.Flex
我的好文推荐
FlexAir开源版-全球免费多人视频聊天室,免费网络远程多人视频会议系统((Flex,Fms3联合开发))<视频聊天,会议开发实例8> 
Sql Server2005 Transact-SQL 新兵器学习总结之-总结 
MS SQL数据库备份和恢复存储过程(加强版本) 
sql server中分布式查询随笔(链接服务器(sp_addlinkedserver)和远程登录映射(sp_addlinkedsrvlogin)使用小总结) 
ASP.NET2.0国际化/本地化应用程序的实现总结(多语言,多文化页面的实现) 
WAP开发资料站(最新更新) 
自定义格式字符串随笔 (IFormattable,IFormatProvider,ICustomFormatter三接口的实现) 
Mcad学习笔记之异步编程(AsyncCallback 委托,IAsyncResult接口,BeginInvoke方法,EndInvoke方法的使用小总结) 
Mcad学习笔记之通过反射调用類的方法,屬性,字段,索引器(2種方法) 
Mcad学习笔记之序列化(2进制和Soap序列 化) 
Mcad学习笔记之委托再理解(delegate的构造器,BeginInvoke,EndInvoke,Invoke4个方法的探讨) 
ASP.NET状态管理之一(概括篇) 
Flex,Fms学习笔记
本文转自aierong博客园博客,原文链接http://www.cnblogs.com/aierong/archive/2005/05/25/162181.html,如需转载请自行联系原作者

Mcad学习笔记之委托再理解(delegate的构造器,MulticastDelegate,BeginInvoke,EndInvoke,Invoke4个方法的探讨)...相关推荐

  1. Mcad学习笔记之通过反射调用類的方法,屬性,字段,索引器(2種方法)

    相关文章导航 Sql Server2005 Transact-SQL 新兵器学习总结之-总结 Flex,Fms3相关文章索引 FlexAir开源版-全球免费多人视频聊天室,免费网络远程多人视频会议系统 ...

  2. Mcad学习笔记之Microsoft Windows服务

    相关文章导航 Sql Server2005 Transact-SQL 新兵器学习总结之-总结 Flex,Fms3相关文章索引 FlexAir开源版-全球免费多人视频聊天室,免费网络远程多人视频会议系统 ...

  3. OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7888 ...

  4. 【学习笔记】产品经理必备技能之数据分析(二)常见数据分析方法(上)

    内容来自小破站<黑马程序员-产品经理必备技能之数据分析>复习自用 [学习笔记]产品经理必备技能之数据分析(二)常见数据分析方法(上) 3 常见数据分析方法 3.1 基础数据分析(日常工作) ...

  5. ESL3.3 子集的选择学习笔记(最优集选择,向前向后逐步选择等方法)

    3.3 子集的选择 这是一篇有关<统计学习基础>,原书名The Elements of Statistical Learning的学习笔记,该书学习难度较高,有很棒的学者将其翻译成中文并放 ...

  6. MySQL学习笔记(五)并发时经典常见的死锁原因及解决方法

    MySQL学习笔记(五)并发时经典常见的死锁原因及解决方法 参考文章: (1)MySQL学习笔记(五)并发时经典常见的死锁原因及解决方法 (2)https://www.cnblogs.com/tiny ...

  7. [网络流]学习笔记:一次理解网络流!

    学一个新算法,总要翻多而杂的blog,收获不多.所以我就致力于把学习笔记总结,希望一遍看懂. 简单入门 (但是不全) 一.从概念入手 网络流用于解决流量问题 网络流:所有弧上流量的集合f={f(u,v ...

  8. C# 学习笔记之委托、lambda表达式

    委托是寻址方法的.NET 版本.在CH中,函数指针只不过是一个指向内存位置的指针,它不是类型安全的.我们无法判断这个指针实际指向什么,像参数和返回类型等项就更无从知晓了.而.NET委托完全不同,委托是 ...

  9. 美团面试惨败!强迫症的我恶补知识,总结面试经验和学习笔记,下次再战!!

    面试大概九十分钟,问的东西很全面,需要做充足准备,就是除了概念以外问的有点懵逼了(呜呜呜~).回来之后把这些题目做了一个分类并整理出答案分为MySQL+Java+Redis+算法+网络+Linux等六 ...

最新文章

  1. Linux 双网卡绑定测试
  2. 浓烟滚滚!某市联通集体断网,谁的锅?
  3. 当年只会C# 所以写C++就成这样了! log4cplus - log4net
  4. vim-plug 插件安装
  5. 前端HTML5CSS3基础知识点
  6. 微机原理——总线和时序
  7. android 软解8k视频,Android Q+5G现场播放8K视频:画面流畅
  8. 使用MATLAB App Design 工具设计一个 简易App
  9. 【R语言文本挖掘】:情感分析与词云图绘制
  10. 互联网中的视频/音频服务
  11. Android连接SQLServer详细教程(数据库+服务器+客户端),并在微软Azure云上搭建云服务
  12. python实现从身份证截取出生日期以及性别判断
  13. python自动化办公入门故事教案_Python自动化办公知识点整理汇总
  14. 团队作业7—团队项目设计完善编码测试
  15. linux内核顶层Makefile详解
  16. (转)2008年精典骗术, 2009年你还会上当吗?
  17. next hop c语言实现,BGP_简单配置,next-hop-self
  18. linuxQt程序打包
  19. GitHub 开源跨平台神器 Electron 实践
  20. SSD+HDD,win7+deepin15.11,win7引导启动失败!

热门文章

  1. 2013智能卡相关行业前景
  2. Bootstrap 标签 label
  3. 使用VueI18n.js实现国际化
  4. SQL Pretty Printer
  5. oracle数据库关闭失败,Oracle突然关闭原因
  6. PS-第十二天-PS色阶的使用原理浅谈
  7. 机器学习中级教程 7.数据泄漏
  8. 牛客wannaflay挑战赛22 签到题 计数器 Wolf and Rabbit HDU 1222
  9. J - 【黄色】这题真的是模板题 (Gym - 102072J )(spfa)
  10. 三极管做开关,常用到的电容作用