这个东似乎比较重要,我做笔记要做的仔细一点

委托

我以前使用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