csyx4.1-委托

委托是1个对象,它知道如何调用1个方法

委托是方法的包装器

委托封装方法

通过委托调用方法,是间接调用,委托相当于cpp中的函数指针

 

把方法赋值给委托变量的时候就创建了委托实例

Main方法想要调用Square方法,通过t间接调用

调用者调用委托,然后委托调用目标方法

委托间接的把调用者和目标方法解耦了

委托是1种方法级别的耦合

简化格式

使用委托编写插件式的方法-方法是在运行时才赋值给委托变量的

使用Transformer委托类型的委托实例t调用Square方法

多播委托-1个委托实例可以引用1组目标方法

+=

委托的调用顺序和它们定义顺序一致

委托可以合并也可以移除

+=

-=

+=/-=的操作数可以为null

委托是不可变的

+=/-=实际上是创建了新的委托实例,并把它赋给当前的委托变量

如果多播委托的返回类型不为void,那么调用者从最后1个被调用的方法来接收返回值

前面的方法仍然会被调用,但是其返回值就被丢弃了

+/+= 

-/-=

System.Delegate的Combine和Remove两个static方法

 

当1个实例方法被赋值给委托对象的时候,

这个委托对象不仅要保留着对方法的引用,

还要保留着方法所属实例的引用

Target属性代表这个实例

泛型委托

泛型委托

Action委托

Func委托

???

Func

out-协变-只能作为输出

Action

in-逆变

使用Func委托替换自定义委托

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

委托使用场景:

1.需要多播能力-委托可以封装1组方法,接口只能定义1个方法

2.订阅者需要多次实现接口-使用委托

订阅者需要多次实现接口-使用委托

ex:

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

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

委托可以接受比它的方法目标更具体的参数类型-逆变

委托可以接受比它的方法目标更具体的参数类型ex:

委托的参数-string

委托封装方法的参数-object

object是string的父类,string比object更具体

委托的variance只支持引用转换-和泛型类型参数一样

√-引用转换

委托参数-string

委托封装方法参数-object

×-数值转换

委托参数-int

委托封装方法参数-long

委托参数-int

委托封装方法参数-object

此处涉及的不是引用转换和数值转换,是1种装箱操作

调用方法时,你可以得到1个比请求的类型更具体的类型的返回结果

委托类型-object

得到的类型-string

隐式的向上转换发生

ex-Func委托和Action委托

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值