第十七章 委托
Posted terry-1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十七章 委托相关的知识,希望对你有一定的参考价值。
目录:
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 委托和反射
以上是关于第十七章 委托的主要内容,如果未能解决你的问题,请参考以下文章