c# ——委托,事件

1.委托delegate

委托实例是调用者的委托:调用者调用委托,委托调用目标方法;

把调用者和目标方法解藕;

2.多播委托

所有委托实例都有多播的方法,即一个委托实例可以有多个目标方法;

委托调用顺序与定义顺序一致;

如果方法返回值不是void,则只会接受到最后一个目标方法的返回值;

使用+=和-=来增减订阅的方法,会被编译成system.delegate的combine和remove静态方法;

所有的委托都是派生自system.MultiCastDelegate,它是派生自system.Delegate;

 

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

实例方法赋值给委托实例时,不仅保留对方法的音乐还要保留对该实例的引用;

system.delegate的Target属性就对应于该实例;

如果引用方法时静态的,则target时null;

 

4.范型委托类型,Func和Action:

public delegate T tansformer<T>(T arg);

Func和Action最多16个输入参数:

delegate TResult Func<in T1,...in T16, out TResult>(T1 arg1, ..., T16 arg16); 

delegate void Func<in T1,...in T16>(T1 arg1, ..., T16 arg16);

 

5. 接口vs委托:

委托可以解决的问题,接口一般也可以解决,但是

委托可以多播,而接口一般只能实现一种方法,所有在多播的场景议案使用委托;

 

6. 委托兼容性

所有的委托都是类型不兼容的;

delegate void T1();
delegate void T2();

void method(){...}

T1 t1 = method;
T2 t2 = t1; //会报编译错误

 如果委托实例具有相同的委托方法,那么委托实例就可以认为是相等的

delegate void D();

D d1 = method;
D d2 = method;

Debug.WriteLine(d1==d2);  //返回true

委托可以接受比方法定义更加具体的参数,叫做ContraValue逆变(仅适用于引用转换而不是值类型转换);

委托方法可以返回一个比委托定义中更具体的方法,叫做Convariance协变

//ContraValue
delegate void D(string s);

void method(object o){...}
D d = method;
d("hello");


//Convariancce
delegate object D();

string method(){return "hello";}
D d = method;
string res = d();

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值