zoukankan      html  css  js  c++  java
  • 初探Lambda表达式

    简单例子

    Expression<Func<int, bool>> exp = m => m == 4;

     了解Net方法,没有比IL来得更加容易。反编译IL代码如下(截取部分显示)

    [0] class [System.Core]System.Linq.Expressions.Expression`1<class [mscorlib]System.Func`2<int32, bool>> expression,
    [1] class [System.Core]System.Linq.Expressions.ParameterExpression expression2,
    [2] class [System.Core]System.Linq.Expressions.ParameterExpression[] expressionArray)
    ldstr
    "m" call class [System.Core]System.Linq.Expressions.ParameterExpression [System.Core]System.Linq.Expressions.Expression::Parameter(class [mscorlib]System.Type, string) call class [System.Core]System.Linq.Expressions.ConstantExpression [System.Core]System.Linq.Expressions.Expression::Constant(object, class [mscorlib]System.Type) call class [System.Core]System.Linq.Expressions.BinaryExpression [System.Core]System.Linq.Expressions.Expression::Equal(class [System.Core]System.Linq.Expressions.Expression, class [System.Core]System.Linq.Expressions.Expression)
    call
    class [System.Core]System.Linq.Expressions.Expression`1<!!0> [System.Core]System.Linq.Expressions.Expression::Lambda<class [mscorlib]System.Func`2<int32, bool>>(class [System.Core]System.Linq.Expressions.Expression, class [System.Core]System.Linq.Expressions.ParameterExpression[])

     这几行IL代码,翻译过来就是

    ParameterExpression parameter = Expression.Parameter(typeof(int), "m");
    ConstantExpression constant = Expression.Constant(4, typeof(int));
    BinaryExpression body = Expression.Equal(parameter, constant);

    var exp = Expression.Lambda(body, new ParameterExpression[] { parameter });

    在调试模式下查看与例子一致。

    深入分析

    从上面例子可以看出,组成Lambda表达式主要是

    • 参数  ParameterExpression  可为空
    • lambda 表达式的主体  (匿名方法或表达式目录树

    从MSDN看Lambda表达式定义

    Lambda 表达式是一种可用于创建委托表达式目录树类型的匿名函数。 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数。 Lambda 表达式对于编写 LINQ 查询表达式特别有用。

    从结果上看,Lambda表达式只是让我们更方便创建匿名函数,本质上就是匿名函数。

    注:

    以上只是个人观点,未必正确。各位还请多加验证。

  • 相关阅读:
    javascript弹出窗口代码
    DOM的核心: Node
    AjaxControlToolkit学习系列(1) DragPanelExtender
    nodeName、nodeValue 以及 nodeType 简单解析
    AjaxControlToolkit学习系列(3) AnimationExtender
    childNodes
    javascript面向对象技术基础(四)
    自定义控件实现无刷新上传图片,立即显示缩略图,保存图片缩略图<原创>
    ADO.NET朝花夕拾(一)
    javascript面向对象技术基础(三)
  • 原文地址:https://www.cnblogs.com/WilsonPan/p/6206762.html
Copyright © 2011-2022 走看看