委托是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委托