zoukankan      html  css  js  c++  java
  • 第十七章 委托

    目录:

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

    每天学习一丢丢
  • 相关阅读:
    WCF 第四章 绑定 在多个绑定上暴露一个服务契约
    WCF 第五章 行为 事务跨操作事务流
    WCF 第五章 导出并发布元数据(服务行为)
    WCF 第五章 行为 通过配置文件暴露一个服务行为
    WCF 第五章 不支持会话的绑定的默认并发和实例
    WCF 第五章 并发和实例(服务行为)
    WCF 第五章 行为 总结
    WCF 第四章 绑定 绑定元素
    WCF 第五章 行为 事务之选择一个事务协议OleTx 或者WSAT
    WCF 第四章 绑定 比较各种绑定的性能和可扩展性
  • 原文地址:https://www.cnblogs.com/terry-1/p/10385419.html
Copyright © 2011-2022 走看看