实例方法目标和静态方法目标
- 当一个实例方法被赋值给委托对象的时候,这个委托对象不仅要保留着对方法的引用,还要保留着方法所属实例的引用。
- System.Delegate 的Target属性就代表着这个实例。
- 如果引用的是静态方法,那么Target属性的值就是null。
泛型委托类型
- 委托类型可以包含泛型类型参数
这里可以自动推断出来 是int 根据参数
Func 和 Action 委托
例子
委托 vs 接口
委托可以解决的问题,接口都可以解决。
什么情况下更适合使用委托而不是接口呢?当下列条件之一满足时:
- 接口只能定义一个方法
- 需要多播能力
- 订阅者需要多次实现接口
委托的兼容性 – 委托类型
- 委托类型之间互不相容,即使方法签名一样:
委托的兼容性 – 委托实例
- 如果委托实例拥有相同的方法目标,那么委托实例就认为是相等的。
委托的兼容性 – 参数
- 当你调用一个方法时,你提供的参数(argument)可以比方法的参数(parameter)定义更具体。
- 委托可以接受比它的方法目标更具体的参数类型,这个叫ContraVariance。
- 和泛型类型参数一样,委托的variance仅支持引用转换。
委托的兼容性 – 返回类型
- 调用方法时,你可以得到一个比请求的类型更具体的类型的返回结果。
- 委托的目标方法可以返回比委托描述里更具体的类型的返回结果,Covariance。
泛型委托类型参数的variance
- Covariance,out
- ContraVariance,in
- 看一下func 和action的源码定义