码迷,mamicode.com
首页 > 其他好文 > 详细

第十七章 委托

时间:2019-02-16 12:03:34      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:height   获取   com   remove   存储结构   实例   语法   完成   窗体   

目录:

17.1 初识委托

17.2 用委托回调静态方法

17.3 用委托回调实例方法

17.4 委托揭秘

17.5 用委托回调许多方法(委托链)

17.6 委托定义不要太多(泛型委托)

17.7 C#为委托提供的简化语法

17.8 委托和反射

 

Microsoft .NET Framework通过委托来提供回调函数机制。

17.1 初识委托

回调函数:在.NET Framework中,可以登记回调方法来获得各种各样的通知,例如未处理的异常,窗口状态变化,菜单项选择,文件系统变化,窗体控件事件和异步操作已完成。

17.2 用委托回调静态方法

委托对象是方法的包装器,使方法能通过包装器来间接回调。

将方法绑定到委托时,C#和CLR都允许引用类型的协变性和逆变性。

协变性是指方法能返回从委托的返回类型派生的一个类型。

逆变性是指方法获取的参数可以是委托的参数类型的基类型。

只要引用类型才支持协变性与逆变性,因为值类型的存储结构是变化的,而引用类型的存储结构始终是一个指针。

17.3用委托回调实例方法

17.4 委托揭秘

使用C#关键字delegate定义委托,编译器和CLR在幕后定义一个完整的类,派生自System.MulticastDelegate类型,后者又派生自System.Delegate,Delegate派生自Object:

类中有四个方法:一个构造器,Invoke,BeginInvoke和EndInvoke。

字段 类型 说明
_target System.Object 当委托对象包装一个静态方法时,这个字段为null。当委托对象包装一个实例方法时,这个字段引用的是回调方法要操作的对象。(字段指出要传给实例方法的隐式参数this的值)
_methodPtr System.IntPtr 一个内部的整数值,CLR用它标记要回调的方法。
_invocationList System.Object 改字段通常为null。构造委托链时它引用一个委托数组。

       

17.5 用委托回调许多方法(委托链)

委托链是委托对象的集合。可利用委托链调用集合中的委托所代表的全部方法。

17.5.1 C#对委托链的支持

C#编译器自动为委托类型的实例重载了+=和-=操作符。操作符分别调用Delegate.Combine和Delegate.Remove

17.5.2 取得对委托链调用的更多控制

委托类型的Invoke方法有局限性。可以使用GetInvocationList,用于显示调用链中的每一个委托,并允许你使用需要的任何算法。

17.6 委托定义不要太多(泛型委托)

Action委托 和 Func委托

17.7 C#为委托提供的简化语法

17.7.1 简化语法1:不需要构造委托对象

17.7.2 简化语法2:不需要定义回调方法(Lambda表达式)

 17.7.3 简化语法3:局部变量不需要手动包装到类中即可传给回调方法。

17.8 委托和反射

 

第十七章 委托

标签:height   获取   com   remove   存储结构   实例   语法   完成   窗体   

原文地址:https://www.cnblogs.com/terry-1/p/10385419.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!