zoukankan      html  css  js  c++  java
  • lAMBDA表达式剖析

    lAMBDA表达式剖析

    Lambda表达式(Lambda Expressions)(拉姆达表达式) 和 匿名方法 其实是一件事情。唯一的不同是:他们语法表现形式不同。Lambda 表达式是在语法方面的更进一步的进化。在本质上,他们是一件事情。他们的作用都是:产生方法。即:内联方法。Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to”。该 Lambda 运算符的左边是输入参数(如果有),右边包含表达式或语句块。Lambda 表达式 x => x * x 读作“x goes to x times x”

    Lambda表达式减少了重复数据的工作量。所有可列举数据是通过使用一个SQL-like 查询语法(一种看起来像SQL的查询,但不同于它)的LINQ来查询的。 LINQ 内置机制将循环枚举数据,并且使用一定的条件构成条件语句过滤数据。LINQ查询效率非常高。 Lambda表达式也是以类似的方式工作。一些现有的扩展方法内嵌Lamdba表达式来执行某些操作, 并且使重复操作变得更容易。我们将很快看到。Lambda表达式能够不需要扩展方法,但是这是现在通常的用法。Lambda 在基于方法的 LINQ 查询中用作标准查询运算符方法(如where)的参数。

    LAMBDA表达式:

    表达式在右边的 Lambda 表达式称为“Lambda 表达式”。 Lambda 表达式在构造表达式树时广泛使用。 Lambda 表达式返回表达式的结果,并采用以下基本形式:

    (input parameters) => expression
    //多参数的可以是
    (x, y) => x == y;

    (int x, string s) => s.Length > x

    复制代码

    LAMBDA语句:

    delegate void TestDelegate(string s);
    TestDelegate myDel = n => { string s = n + " " + "World"; Console.WriteLine(s); };
    myDel("Hello");

    复制代码

    自定义动态LAMBDA表达式:

    Func是一个delegate的泛型,实例化该泛型的是具有一个int类型参数,返回布尔类型的方法。

    Expression<Func<int,bool>> 表示可以执行任意的方法,定义完成后可以使用Compile来进行编译,如果编译成功便可以执行。

    可以自定义动态的lambda表达式如:

     1  // a*b+2
    2 ParameterExpression paraLeft = Expression.Parameter(typeof(int), "a");
    3 ParameterExpression paraRight = Expression.Parameter(typeof(int), "b");
    4
    5 BinaryExpression binaryLeft = Expression.Multiply(paraLeft, paraRight);
    6 ConstantExpression conRight = Expression.Constant(2, typeof(int));
    7
    8 BinaryExpression binarybody = Expression.Add(binaryLeft, conRight);
    9
    10 // Expression<Func<int, int, int>> lambda = (a, b) => a * b + 2;
    11 Expression<Func<int, int, int>> lambda = Expression.Lambda<Func<int, int, int>>(binarybody, paraLeft, paraRight);//表达式树
    13
    14 Func<int, int, int> myfunction = lambda.Compile();
    15 int result = myfunction(10, 20);

    复制代码

    Lambda 的一般规则如下:

    • Lambda 包含的参数数量必须与委托类型包含的参数数量相同。

    • Lambda 中的每个输入参数必须都能够隐式转换为其对应的委托参数。

    • Lambda 的返回值(如果有)必须能够隐式转换为委托的返回类型。

    请注意,Lambda 表达式本身没有类型,因为常规类型系统没有“Lambda 表达式”这一内部概念。但是,有时会不正式地论及 Lambda 表达式的“类型”。 在这些情况下,类型是指委托类型或 Lambda 表达式所转换为的 Expression 类型。

    Lambda 表达式中的变量范围规则:

    • 捕获的变量将不会被作为垃圾回收,直至引用变量的委托超出范围为止。

    • 在外部方法中看不到 Lambda 表达式内引入的变量。

    • Lambda 表达式无法从封闭方法中直接捕获 ref 或 out 参数。

    • Lambda 表达式中的返回语句不会导致封闭方法返回。

    • Lambda 表达式不能包含其目标位于所包含匿名函数主体外部或内部的 goto 语句、break 语句或 continue 语句。

    标签: lambda

    原文地址:http://www.cnblogs.com/smallcup/archive/2012/04/06/2434791.html

  • 相关阅读:
    整理一下看过的图像识别的文章(人脸、车牌、验证码)
    从大象安全套到超级表格
    HDU 3157 Crazy Circuits(有源汇上下界最小流)
    struts2学习笔记(5)---自己定义拦截器
    【分享】4412开发板-嵌入式Linux开发须要掌握的基础知识和技能
    ConvertHelper与泛型集合
    G711
    关于众筹的一些经验,希望能有帮助
    Java基础 Day14 泛型
    LeetCode144:Binary Tree Preorder Traversal
  • 原文地址:https://www.cnblogs.com/suizhikuo/p/2435297.html
Copyright © 2011-2022 走看看