Lambda详解 => {C#莱姆达表达式}

1语法

(输入参数)=>表达式

 ( 输入参数 )=>  表达式

存在的意义

比如定义一个u8 num;的变量。那num只能赋值u8类型的数据。
如果赋值(方法)呢!使num能赋值方法类型而不是u8类型。这时莱姆达就来了。delegate委托建的变量可以接受方法类型,赋值的时候没必要每次都new方法,因为多数情况这方法只用一次,所以直接写方法(  ),如果有参数的话就加参数参数1,参数2,参数3,有了方法后,是不是还要有方法体,就不需要new了直接用莱姆达新建出方法体    => {    }
这样在  {   }   花括号里就可以添加语句了。 

(参数1,参数2,参数3,参数4) => {  语句1;   语句2;   语句n;  }

参数1  =>   语句1;      // 这种是语法糖简写

//======================================

莱姆达的作用:

方法的参数是对象或者值类型, 要是参数的类型,是方法,怎么办?

函数的参数是方法类型怎么办呢?

void  run ( 方法  ff );

这类型是不是想不出来?

我们回顾一下,方法是怎么写的    void  main ( void){  ....  };

无名无参无返回怎么写?

()
{
  语句1;
  语句2;
}

我们已经知道委托类型delegate可以解决参数入口传方法的问题。

我们在写程序的时候都是先写好方法,然后再调用。

但我现在,正在写程序的时候就要调用方法,这种和尚要老婆的急事怎么办?

那就赶紧生个老婆出来,对,程序就是这么干的。一般这老婆就用一次,是一次性的(比如plc上电,后面我就再也用不到这个方法了)

这种一次性的方法,你给她起名字,已经没有意义了。 比如 delay_ms(10); 这种有名字的方法,你肯定是下次还想调用它,再延时10毫秒。

这种无名的方法 就是括号的左边没有名字      ()

有了无名方法,你想给她传参数怎么写?

当然和我们平时调用方法的习惯一样,在括号内直接填参数    ( 参数1,参数2,参数3 )

如果参数只有一个,那括号都可以懒的写了,直接省略         参数1 =>{ 语句; }

那方法体怎么写?

我们用   =>  这个符号来告诉编译器,后面的是方法体

参数1  => { 语句1;语句2;}

到这里,实际就已经讲完了,你学会了吗?

 参数1 => 
{
   参数1=20;
   delay_ms(参数1);
}
 C => 
{
  int B = C;
   delay_ms( B );
}

 在方法  ( )  前加尖括号是参数类型占位符

MyDelegate<T1,T2,T3> (T1 A,T2 B){return A+B;}//最后T3是返回类型

 参数类型占位可以写多个,但没意义,用多少写多少。

原型:sayhallo cal2=delegate(int a,int b){ return  a+b;};
int  c=(int a,int b)=> { return  a+b;};//匿名的方法的参数
//================
public delegate T3 mydelegate<T1,T2,T3>(T1 A,T2 B);
mydelegate<T1,T2,T3> (T1 A,T2 B){return A+B;}//最后T3是返回类型

 莱姆达表达式是匿名函数的委托
在符号  =>  左边是填参数,如(int a,int b),如果只有一个参数,可以省略()括号;
例:delegate    at=a=>{方法1;方法2;方法n;return  a;};
例:delegate    at=(a,b)=>{return  a+b;};      //a和b是推断类型
例:delagate    at=()=>{return 1;};
例:delagate    at=(int a,int b)=>retun 0;     //只有一条语句可以省略{}花括号

=>  读  “goes  to”


Func< int,int,char,bool >  del2 = ( x,y,z)  =>   x>0; //名称是del2的方法,第1个参数是int,第3个参数是char,返回类型是bool类型。
注:最后一个类型是返回值类型,前面的是参数类型。可以用标识符代替,为推断类型。

方法的参数是方法:
public int 方法1(Func<int,int,int>method,int[]nums,int start,int to)
{

}
方法1(add,数组,0,2);//  方法1((a,b)=>a+b,数组,0,2);

无返回的系统委托:
Action< string > AT=(name)=> Console.WriteLine("结果是:");
原型:public delegate void Action < in T>( T obj);


 

 以上是几年前 我qq空间里做的笔记,可以参考一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值