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#编程指南。