CSharp Basic Tutorial Chapter-4-2 委托(下)


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

  • 当一个实例方法被赋值给委托对象的时候,这个委托对象不仅要保留着对方法的引用,还要保留着方法所属实例的引用。
  • System.Delegate 的Target属性就代表着这个实例。
  • 如果引用的是静态方法,那么Target属性的值就是null。

delegate
delegatedemo

泛型委托类型

  • 委托类型可以包含泛型类型参数

genericdemo1
genericdemo2
genericdemo3
genericdemo4
这里可以自动推断出来 是int 根据参数

Func 和 Action 委托

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

    Func 和 Action

  • System 命名空间

system
systemdemo1
systemdemo2

例子
case

委托 vs 接口

委托可以解决的问题,接口都可以解决。
什么情况下更适合使用委托而不是接口呢?当下列条件之一满足时:

  • 接口只能定义一个方法
  • 需要多播能力
  • 订阅者需要多次实现接口

delegateInterface

委托的兼容性 – 委托类型

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

deleteType

委托的兼容性 – 委托实例

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

delegateInstance

委托的兼容性 – 参数

  • 当你调用一个方法时,你提供的参数(argument)可以比方法的参数(parameter)定义更具体。
  • 委托可以接受比它的方法目标更具体的参数类型,这个叫ContraVariance。
  • 和泛型类型参数一样,委托的variance仅支持引用转换。

delegatePara1
delegatePara2

委托的兼容性 – 返回类型

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

return

泛型委托类型参数的variance

  • Covariance,out
  • ContraVariance,in
  • 看一下func 和action的源码定义

文章作者: Chaoqiang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Chaoqiang !
评论
 上一篇
CSharp Basic Tutorial Chapter-4-3 事件 CSharp Basic Tutorial Chapter-4-3 事件
Event 事件 使用委托的时候,通常会出现两个角色,一个广播者,一个订阅者 广播和订阅 使用委托的时候,通常会出现两个角色,一个广播者,一个订阅者 广播者这个类型包含一个委托字段,广播者通过调用委托来决定什么时候进行广播。 订阅者是方
下一篇 
CSharp Basic Tutorial Chapter-4-1 委托(上) CSharp Basic Tutorial Chapter-4-1 委托(上)
Delegates 委托 委托是一个对象,它知道如何调用一个方法 委托类型和委托实例 委托类型定义了委托实例可以调用的那类方法,具体来说,委托类型定义了方法的返回类型和参数。 例子 委托实例把方法赋值给委托变量的时候就创建了委托实例。
  目录