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

    每天学习一丢丢
  • 相关阅读:
    spring MVC fromeWork 與webwork2 mvc 比較
    JAVA Oauth 认证服务器的搭建
    HTTPS的工作原理
    理解HTTP幂等性
    支付交易一般性准则
    设计模式六大原则
    腾讯微信技术总监周颢:一亿用户增长背后的架构秘密
    Valid Parentheses
    4Sum
    Letter Combinations of a Phone Number
  • 原文地址:https://www.cnblogs.com/terry-1/p/10385419.html
Copyright © 2011-2022 走看看