Lambda表达式
来源:互联网 发布:还珠格格小燕子知乎 编辑:程序博客网 时间:2024/05/17 02:13
Lambda表达式是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式树类型。Lambda表达式返回表达式的结果。Lambda 表达式用于编写 LINQ 查询表达式特别有用。
基本形式如下:
(input parameters) => expression
=>为lambda运算符,运算符左边是输入参数(如果有的话),右边包含表达式或语句块。
如:
(x,y)=> x==y; //这个返回bool类型的值
(int x, string s) => s.length > x ; //有时编译器难于或无法推断出输入类型,故显示指定
()=>SomeMethod(); // 使用空括号指定零个输入参数
创建表达式树类型:
using System.Linq.Expressions;namespace ConsoleApplication1{ class Program { static void Main(string[] args) { Expression<del> myET = x => x * x; } }}
=> 运算符具有与赋值运算符 (=) 相同的优先级,并且是右结合运算符。
Lambda语句
Lambda语句与Lambda表达式类似,只是语句在大括号中:
(input parameters)=>{statement;}
Lambda语句的主体理论是是可以包含任意数量的语句,但是通常不会多于两三句。
Lambda表达式中的变量范围
Lambda可以引用外部变量,这些变量位于在其中定义 Lambda 的封闭方法或类型的范围内。 将会存储通过这种方法捕获的变量以供在 Lambda 表达式中使用,即使变量将以其他方式超出范围或被作为垃圾回收。 必须明确地分配外部变量,然后才能在 Lambda 表达式中使用该变量。
以下为例子:
delegate bool D(); delegate bool D2(int i); class Test { public D del; public D2 del2; public void TestMethod(int input) { int j = 0; del = () => { j = 10; return j > input; }; del2 = x => { return x == j; }; //delegate未被调用 //输出:j=0 Console.WriteLine("j = {0}", j); bool boolResult = del(); //输出:j=10 、 boolResult = True Console.WriteLine("j = {0} . boolResult = {1}", j, boolResult); } } class Program { static void Main(string[] args) { Test test = new Test(); test.TestMethod(5); //此处证明del2仍然保留TestMethod中得到的local变量的值 bool result = test.del2(10); //输出True Console.WriteLine(result); Console.ReadLine(); } }
在del调用后为j赋值为9,且TestMethod方法调用结束后被回收了,但是在调用del2()委托实例时,其中j仍然保留了j的值为9.
下面为适用于Lambda表达式中变量范围的规则:
捕获的变量将不会被作为垃圾回收,直至引用变量的委托超出范围为止。
在外部方法中看不到 Lambda 表达式内引入的变量。
Lambda 表达式无法从封闭方法中直接捕获 ref 或 out 参数。
Lambda 表达式中的返回语句不会导致封闭方法返回。
Lambda 表达式不能包含其目标位于所包含匿名函数主体外部或内部的 goto 语句、break 语句或 continue 语句。
参考自MSDN C#编程指南。
- Lambda Expressions(Lambda表达式)
- Lambda表达式
- Lambda表达式
- Lambda 表达式
- Lambda表达式
- lambda表达式
- lambda表达式
- Lambda表达式
- Lambda表达式
- Lambda表达式
- Lambda表达式
- Lambda 表达式
- Lambda表达式
- Lambda 表达式
- Lambda 表达式
- Lambda表达式
- Lambda表达式
- Lambda 表达式
- poj 3974 Palindrome(最长回文子串,处理大数,Manacher算法)
- 属性过滤选择器
- jQuery选择器分类,总结
- 经典的机器学习方面源代码库
- Mac下好用的HTTP/HTTPS抓包工具Charles
- Lambda表达式
- 关于Android的nodpi,xhdpi,hdpi,mdpi,ldpi
- 如何在 Windows 8 設定開機啟動程式
- dijkstra算法
- 怎样才能学好Linux
- 移植qt常见错误修改方法
- 小妞会装机 -- 一个装机软件的开发笔记(六)
- Linux块设备驱动实例
- 黑马程序员_Java内存区域