c++和c#的lambda函数

C++

可以当作匿名函数,c++11加入
语法:[captures] (params) -> ret {Statments;}
Statments :语句
ret:return,返回值的类型
params:参数列表
captures:变量捕获
如:[ ] (int a) -> bool { cout<
没有返回值(即void)可不写-> ret ,即简写成[ ] (int a) { cout<

其中captures为捕获外部变量使用:
[ ]:不捕获变量
[&] :引用
[=]:赋值,即拷贝一份
[value]:单独拷贝value
[this]:当前类的this
[&,v1]:多个选项逗号隔开
例子:

int a=10;
[ ]( ) {cout<

C#

Lambda 表达式是一种可用于创建 委托 或 表达式目录树 类型的 匿名函数 。
语法:(params) => {Statments;}(params) => expression。与c++对比,没有方括号,->=>,不能写返回类型ret,返回值类型由被赋值的委托对象决定。
注意:
1.参数类型可不写,当编译器推断困难出错时要显式指定。

2.参数只有一个且无显式指定类型可不用括号包起来,其余情况必需有括号。

3.=>右则为表达式时,如果有返回值则表达式同时充当返回值(相当于隐藏return)。如果是语句块,用回花括号{}括起来即可。注意return value 这种不是表达式是语句,需要花括号

4.c#的var和c++的auto对lambda是有些不同的。c++可直接auto m=(lambda表达式)获取匿名函数,但在c#中不能用var代替,必须显式的指定类型(类名) m=(lambda表达式)。这里的类名需要在方法体外(可以类成员or命名空间内)使用特殊的定义方法:

delegate int A(int i); //就是像方法一样定义,前面加关键字delegate,A就能用来定义
....//代码
A a = x => x*x; //形参x与上面的i不需要同名称,跟平时理解的参数相同(实际就是用一个委托对象指向匿名函数)
//或A a = (int x) => x*x;
//或A a = (int x) =>{ return x*x ;};

Java

语法:(params) -> {Statments;}(params) -> expression,就是把c#的=>又换回->,其余一个鸟样。如果要像c++和c#一样指向该lambda函数,java用Cosumer接口去指向,详情右转jdk1.8

你可能感兴趣的:(c++和c#的lambda函数)