• C# -- 委托(二)


    实例方法目标和静态方法目标

    实例方法就是通过new一个对象,调用里边的方法,静态方法就是直接通过类名调用,这都是C#基础知识。

    1:当一个实例方法被赋值给委托对象的时候,这个委托对象不仅要保留着对方法的引用,还要保留着方法所属实例的引用。

    2:System.Delegate的Target属性就代表着这个实例。

    3:如果引用的是静态方法,那么target属性的值就是null。

    比如:

    输出:

    可以看到,方法名称一样,实例保留!

    泛型委托类型

    委托类型可以包含泛型类型参数,比如: public delegate T TransFormer<T>(T arg)  

    如图,还是之前那个例子,直接改为泛型就行:

    调用:

    其结果是一样的!

    Func和Action委托

    使用泛型委托就可以写出这样一组委托类型,他们可以调用的方法可以拥有任意的返回类型和任意数量的参数

     

    把之前那个泛型方法和参数修改一下,直接使用Func,不使用delegate,如下:

    输出一样的结果!这样省了不少事!

    委托VS接口

    委托可以解决的问题,接口都可以解决。

    什么情况下更适合使用委托,而不是接口呢,当下列条件之一满足时,

    1:接口只能定义一个方法

    2:需要多播能力

    3:订阅者需要多次实现接口

    委托的兼容性 -- 委托类型

    委托类型之间互不相容,即使方法签名一样,如下:

    委托的兼容性 -- 委托实例

    如果委托实例拥有相同的方法目标,那么委托实实例就认为是相等的,如下:

    委托的兼容性 -- 参数

    当你调用一个方法时,你提供的参数(argument)可以比方法数( Parameter )定义更具体。委托可以接受比它的方法目标更具体的参数类型,这个叫 ContraVarjanc,如图:

    string比object更具体! 和泛型类型参数一样,委托的 varlance'仅支持引用转换,如下:

    int到object类型涉及到的装箱和拆箱,不是引用转换,所以会报错;

    委托的兼容性 -- 返回类型

    调用方法时,你可以得到一个比请求的类型更具体的类型的返回结果。”委托的目标方法可以返回比委托描述里更具体的类型的返回结果, Covarjance

     

    委托的类型是object,传入的方法其实是string类型。

    委托就学到这里,结束!!!!!!!

  • 相关阅读:
    react实现转盘动画
    a标签做锚点定位,有部分内容被置顶头部遮挡的解决方法
    react复制文案到剪切板
    MySQL Windows安装配置
    Qt编译MySQL驱动
    P8375 [APIO2022] 游戏 解题报告
    CF1687E Become Big For Me 出题报告
    解决 windows 10 WSL 安装Ubuntu后 屏幕亮度飙至最高 且屏幕亮度无法调节 外接显示器无法显示 的问题
    Dubbo3 源码系列 Dubbo“纠葛”(入门篇)
    windows监控进程死亡并拉起
  • 原文地址:https://www.cnblogs.com/dcy521/p/13499225.html
Copyright © 2020-2023  润新知