委托,lambda表达式和事件
这个东似乎比较重要,我做笔记要做的仔细一点
委托
我以前使用java写Android遇到过一个问题,就是要自定义继承一个广播类重写一些东西。但是类处理的东西的上下文有关,我想要实现它,就不能不作为一个内部类来处理,我当时非常想把这个类单出拎出来,可惜我不知道怎么实现,我觉得C#的委托可以实现我当时的需求
声明
和普通的方法特别像,其实就是取了一个名字
//委托:需要一个关键词delegate、入参(可空)、出参(可void)
public delegate string GETaa();
public delegate void GETbb(int a);
//方法
public string GETaa(){……}
public void GETbb(int a){……}
使用
GetAString firstStringMethod = new GetAString(x.ToString);//原始
GetAString firstStringMethod = x.ToString;//委托推断
firstStringMethod(6);
Action<T> 和Func<T>
泛型委托,前者是void类型的委托,没有返回,后者带一个返回。
里面的入参都是0~16个,Func看起来是1~17个,因为带返回参数
多播
可以使用+=和-=操作
使得委托有多个方法操作,但是这个运行的顺序不是很保证,对于有先后顺序的,不建议使用
在使用多播的过程中,如果出现异常报错,就会终止,所以可以使用一下方法
delegate void A;
A a=S1;
a+=S2;
Delegate[] ddd=a.GetInvocationList();
foreach(A b in ddd){
try{
b();
}catch(Exception){
……
}
}
lambda表达式
lambda表达式的一个场合是吧lambda表达式赋予委托类型:在线实现代码。
Func<string,string> oneFunc = s=>$"sdada is {S}";
Func<int,int,int> oneFunc = (x,y)=>x+y;
Func<int,int,int> oneFunc = (x,y)=>{
return x*y;//添加括号的方式
}
Func<int,int,int> oneFunc = (x,y)=>{
if(x>y){
x++;
return x*y
}else{
y++;
return y/x;
}
}
闭包
lambda可以访问外部代码块的变量,称为闭包,同时可以修改。
他其实每次在使用的时候,都是会重新生成一个匿名类,把用到的外部变量“刷新”一下。
所以 ,多线程的情况下最好不要用
int a=5;
Func(int,int) f = s=>x+a;
a=6;
s(1);
--out
7