• 第十七章 委托


    目录:

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

    每天学习一丢丢
  • 相关阅读:
    浅析锂电池保护板(BMS)系统设计思路(一)
    手把手,嘴对嘴,讲解UCOSII嵌入式操作系统的任务(三)
    手把手,嘴对嘴,讲解UCOSII嵌入式操作系统的任务(二)
    手把手,嘴对嘴,讲解UCOSII嵌入式操作系统的任务(一)
    手把手,嘴对嘴,讲解UCOSII嵌入式操作系统的任务调度策略(五)
    手把手,嘴对嘴,讲解UCOSII嵌入式操作系统的任务调度策略(四)
    手把手,嘴对嘴,讲解UCOSII嵌入式操作系统的任务调度策略(三)
    精度要求较高的场景对float和double浮点数据的处理
    小数形式的十进制数字转换为二进制(附过程)
    mysql 隐式转换问题(案例二)
  • 原文地址:https://www.cnblogs.com/terry-1/p/10385419.html
Copyright © 2020-2023  润新知