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类型。
委托就学到这里,结束!!!!!!!