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类型。

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

posted @ 2020-08-13 22:10  初晨~  阅读(174)  评论(0编辑  收藏  举报