第十七章 委托

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 委托和反射

 

以上是关于第十七章 委托的主要内容,如果未能解决你的问题,请参考以下文章

第十七章.网络编程

VLSI数字信号处理系统——第十七章低功耗设计

第十七章:方法的重载

第十七章:方法的重载

第十七章:组合查询

WPF学习第十七章 鼠标输入