c语言lambda表达式,Lambda表达式究竟简化了什么

1,Lambda表达式究竟简化了什么如果是以前应该用:delegate(int x)也就是说,lanbda表达式将简单方法的参数列表和方法体简写了!去掉了原来方法的结构!让你用一种更简洁的方式来表达方法!
2,Lambda 表达式有何用处如何使用简单来说 , 编程中提到的 lambda 表达式 , 通常是在需要一个函数 , 但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数 。这一用法跟所谓 λ 演算(题目说明里的维基链接)的关系,有点像原子弹和质能方程的关系,差别其实还是挺大的 。不谈形式化的 λ 演算,只说有实际用途的匿名函数 。先举一个普通的 Python 例子:将一个 list 里的每个元素都平方:map( lambda x: x*x, [y for y in range(10)] )这个写法要好过def sq(x):return x * xmap(sq, [y for y in range(10)]),因为后者多定义了一个(污染环境的)函数,尤其如果这个函数只会使用一次的话 。而且第一种写法实际上更易读,因为那个映射到列表上的函数具体是要做什么,非常一目了然 。如果你仔细观察自己的代码,会发现这种场景其实很常见:你在某处就真的只需要一个能做一件事情的函数而已,连它叫什么名字都无关紧要 。Lambda 表达式就可以用来做这件事 。
3,C中lambda表达式怎么用格式是[...](T1 t1, T2 t2 ...) }//例:int func(inta, int b, std::functionf) { return f(a, b); } void test() { int a = 10; int b = 20; int b2 = 30; // 要访问局部变量 , 放入中括号中 int c = test(a, b, [a, &b](int m, int n) { printf("a = %d\n", a); // a是值传递 printf("b = %d\n", b); // b是引用传递 //printf("b2 = %d\n", b2); // b2不可访问 return m + n; }); // & 表示的其它的都以引用传递 int d = test(a, b, [a, &](int m, int n) { printf("a = %d\n", a); // a是值传递 printf("b = %d\n", b); // b是引用传递 printf("b2 = %d\n", b2); // b2引用访问 return m * n; }); printf("c = %d\n", c); printf("d = %d\n", d); } 注意:引用传递时 , 原变量的作用范围,如果在执行lamda时原变量已销毁的话,就出错了你可以理解为匿名函数比如你代码里有一些小函数 , 而这些函数一般只被调用一次(比如函数指针),这时你就可以用lambda表达式替代他们,这样代码看起来更简洁些,用起来也方便【c语言lambda表达式,Lambda表达式究竟简化了什么】
4,Lambda表达式的C表达式C#的Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to” 。语法如下:形参列表=>函数体函数体多于一条语句的可用大括号括起 。可以将此表达式分配给委托类型,如下所示:delegate int del(int i); del myDelegate = x=>Lambda 用在基于方法的 LINQ 查询中,作为诸如 Where 和 Where 等标准查询运算符方法的参数 。使用基于方法的语法在 Enumerable 类中调用 Where 方法时(像在 LINQ to Objects 和 LINQ to XML 中那样) , 参数是委托类型 System..::.Func<(Of <(T, TResult>)>) 。使用 Lambda 表达式创建委托最为方便 。例如 , 当您在 System.Linq..::.Queryable 类中调用相同的方法时(像在 LINQ to SQL 中那样),则参数类型是 System.Linq.Expressions..::.Expression<Func>,其中 Func 是包含至多五个输入参数的任何 Func 委托 。同样,Lambda 表达式只是一种用于构造表达式目录树的非常简练的方式 。尽管事实上通过 Lambda 创建的对象的类型是不同的 , 但 Lambda 使得 Where 调用看起来类似 。在前面的示例中,请注意委托签名具有一个 int 类型的隐式类型输入参数,并返回 int 。可以将 Lambda 表达式转换为该类型的委托,因为该表达式也具有一个输入参数 (x),以及一个编译器可隐式转换为 int 类型的返回值 。(以下几节中将对类型推理进行详细讨论 。)使用输入参数 5 调用委托时,它将返回结果 25 。在 is 或 as 运算符的左侧不允许使用 Lambda 。适用于匿名方法的所有限制也适用于 Lambda 表达式 。有关更多信息,请参见匿名方法(C# 编程指南) 。下列规则适用于 Lambda 表达式中的变量范围:捕获的变量将不会被作为垃圾回收,直至引用变量的委托超出范围为止 。在外部方法中看不到 Lambda 表达式内引入的变量 。Lambda 表达式无法从封闭方法中直接捕获 ref 或 out 参数 。Lambda 表达式中的返回语句不会导致封闭方法返回 。Lambda 表达式不能包含其目标位于所包含匿名函数主体外部或内部的 goto 语句、break 语句或 continue 语句 。Lambda表达式的本质是“匿名方法”,即当编译我们的程序代码时,“编译器”会自动将“Lambda表达式”转换为“匿名方法” , 如下例:string[] names=Lambda表达式的语法格式:参数列表 => 语句或语句块其中“参数列”中可包含任意个参数(与委托对应),如果参数列中有0个或1个以上参数,则必须使用括号括住参数列,如下:() => Console.Write(0个参数)I => Console.Write(1个参数时参数列中可省略括号,值为:(x,y) => Console.Write(包含2个参数 , 值为:而“语句或语句块”中如果只有一条语句,则可以不用大括号括住否则必须使用,如下:I => Console.Write(只有一条语句)I => //两条语句时必须要大括号I => 如果“语句或语句块”有返回值时,如果只有一条语句则可以不输写“return”语句,编译器会自动处理,否则必须加上,如下示例:“Lambda表达式”是委托的实现方法,所以必须遵循以下规则:1)“Lambda表达式”的参数数量必须和“委托”的参数数量相同;2)如果“委托”的参数中包括有ref或out修饰符,则“Lambda表达式”的参数列中也必须包括有修饰符;例子:class Test3)如果“委托”有返回类型 , 则“Lambda表达式”的“语句或语句块”中也必须返回相同类型的数据;4)如果“委托”有几种数据类型格式而在“Lambda表达式”中“编译器”无法推断具体数据类型时,则必须手动明确数据类型 。例子:(错误代码)classTest在以下方法或属性之间的调用不明确:“ConsoleApplication1.Test.Print(ConsoleApplication1.Test.AddHandler<int>)”和“ConsoleApplication1.Test.Print(ConsoleApplication1.Test.AddHandler<double>)”所以我们必须明确数据类型给编译器,如下:Print((intx,inty)=>x+y);这样我们的代码就能编译通过了 。5,什么是CLambda表达式....我去,我写了好久 , 突然,鼠标发疯了,删了....呜呜哎呦我去,在打一遍吧...哈哈lambda表达式 用好了,学会了,非常有用的lambda表达式 说白了:就是微软发明出来的,用于 简化 "匿名方法" 的一种表达式了如果不懂,请问百度,或者,继续往下看:lambda表达式应该是高级概念了,应该和委托事件一起讲的所以你可能已经接触了 委托事件了(如果没有接触的话,应该去看看委托事件的 , 这3个东西是连在一起的,这样才会更好的理解 lambda表达式的)看代码:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleApplication1 public delegate string 委托(int s);//定义一个委托 class Program static void Main(string[] args) 委托 s1 = delegate(int ss) 委托 s2 = st => Console.WriteLine(s1(15));//结果都一样滴 Console.WriteLine(s2(15)); Console.Read(); } }},看到没 , 看到没,lambda表达式,简化了上面的匿名方法 , 好理解了吧?。。∈前桑 。。。ㄅ?,好吧,这....需要点时间的)但是没有关系,百度在 , 不用怕!——————————————————————lambda表达式格式:(参数列表)=>(表达式或者语句)嘿嘿,简单吧 , 是不?=>就是相当于是吧,看到没 , 看到没??(⊙o⊙)…可是还是有点不太懂哦这个是需要了解 委托 事件 的,了解流程:1:委托——2:lambda表达式—:3:事件如果你要坚持学习C# , 那么 事件委托lambda表达式 就要必须懂的这些是必要的概念,就像你学习编程一样,肯定必须要了解面向对象...的意思说了这么多,你听懂了没??????还是那句话,百度 , 我给你个网址,可以去那里学 , 比较好的:string 网址=@"http://www.cnblogs.com/kingmoon/archive/2011/05/03/2035696.html";如有疑问,请您追问!FSP团队 ASV大宝答匿名函数(anonymous function)是表示“内联”方法定义的表达式 。匿名函数本身及其内部没有值或者类型,但是可以转换为兼容的委托或者表达式树类型 。匿名函数转换的计算取决于转换的目标类型:如果是委托类型,则转换计算为引用匿名函数所定义的方法的委托;如果是表达式树类型 , 则转换将计算以对象结构形式表示方法结构的表达式树 。匿名函数有两种语法风格:lambda表达式(lambda-expression)和匿名方法表达式(anonymous-method-expression) 。在几乎所有的情况下,lambda表达式都比匿名方法表达式更为简介具有表现力 。但现在c#语言中仍保留了后者 , 为了向后兼容 。<li>lambda表达式:async可选 (匿名的函数签名)=> (匿名的函数体)<li>匿名方法表达式:async可选 delegate (显式的匿名函数签名) 可选{代码块}其中匿名的函数签名可以包括两种,一种是隐式的匿名函数签名另一种是显式的匿名函数签名:隐式的函数签名:(p)、(p1,p1)显式的函数签名:(int p)、(int p1,int p2)、(ref int p1,out int p2)匿名的函数体可以是表达式或者代码块 。从上面我们可以看出 , lambda表达式的参数形式可以显式或者隐式类型化 。在显式类型化参数列表中,每个参数的类型是显式声明的,在隐式类型化参数列表中 , 参数的类型是从匿名函数出现的上下文中推断出来的 。当lambda表达式只有一个具有隐式类型化参数的时候,参数列表可以省略圆括号,也就是说:(参数) => 表达式可以简写为参数 =>表达式一些匿名函数的示例x => x + 1 //隐式的类型化,函数体为表达式x => {return x + 1;} //隐式的类型化,函数体为代码块(int x) => x + 1 //显式的类型化,函数体为表达式(int x) => {return x + 1;} //显式的类型化,函数体为代码块(x , y) => x * y //多参数() => console.writeline() //无参数async (t1 , t2) => await t1 + await t2 //异步delegate (int x) {return x + 1;} //匿名函数方法表达式delegate {return 1 + 1;} //参数列表省略lambda表达式和匿名方法表达式的区别:1. 当没有参数的时候,匿名方法表达式允许完全省略参数列表 , 从而可以转换为具有任意值参数列表的委托类型,lambda表达式则不能省略参数列表的圆括号() 。2. lambda表达式允许省略和推断类型参数 , 而匿名方法表达式要求显式声明参数类型 。3. lambda表达式主体可以为表达式或者代码块,而匿名方法表达式的主体必须为代码块 。4. 只有lambda表达式可以兼容到表达式树类型 。

    推荐阅读