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


原创粉丝点击