【问题标题】:Expressions vs Lambdas表达式与 Lambda
【发布时间】:2011-08-22 23:21:34
【问题描述】:

我知道什么是 Lambda 表达式。

但我不确定这是否与Expression 相同。这里似乎比我知道的要多。

我正在查看wrapping IQueryable,它经常使用表达式。那么,例如,这里的“表达式”参数是否比 Lambda 中所能想到的更多?

public InterceptedQuery(InterceptingProvider provider, Expression expression) 
{ 
    this._provider = provider; 
    this._expression = expression; 
}  

【问题讨论】:

    标签: c# .net expression


    【解决方案1】:

    lambda 表达式 是一种编译器功能,可根据上下文编译成以下两种情况之一:

    • 一个(隐藏的)函数和一个委托给它
    • Expression

    一旦编译了应用程序,lambda 表达式的概念就不存在了,因为它已经变成了上述两个选项之一。

    我不知道你的意思是什么

    这里的 'Expression' 参数是否比 Lambda 中所能想到的更多

    表达式以可检查的形式封装和表达应用程序逻辑(换句话说,它可以让您查看开发人员在调用的属性和函数、包含的常量、比较等方面所写的内容)。这就是查询提供程序(大多数情况下,像实体框架这样的对象关系映射器)获取代码并将其转换为 SQL 的方式。

    【讨论】:

      【解决方案2】:

      Lambda 通常是编译后的代码,其中 Expression 表示“抽象语法树”(AST),即。表示代码的数据结构,可以编译为代码。 IQueryable 通常在 Expression 上运行,因为它应该将 AST 编译为在不同环境中运行的代码,例如 SQL 服务器,而不仅仅是主机。有可编译为 SQL (Linq2Sql)、JavaScript、OpenGL 着色器 (Bling) 等的 IQueryableProvider。

      如果方法参数需要正确类型的表达式,C# 编译器有时可以将 lambda 转换为表达式:

      void Foo(Expression<Func<int>>) { ... }
      ...
      Foo(() => 3);
      

      【讨论】:

      • "Lambdas 通常是编译代码" 这是不正确的,虽然 lambdas 当然可以用于创建编译代码(它们成为隐藏的、编译器生成的函数的委托),但它们也用于创建 @987654322 @对象;创建哪个是由上下文决定的。我不想投反对票,因为您关于 AST 的信息肯定是正确的,但第一句话暗示 Lambda 和表达式之间存在差异。
      • 强调一般。 lambda 的全部表达能力目前仅对委托可用,因为“语句 lambda”不能编译为表达式。表达式是 lambda 的一个贫乏子集。我还估计大多数 lambda 使用是 System.Linq,它使用委托,但也许我对这个估计有偏见。
      • 我不同意;我认为大多数 LINQ 语句是 LINQ-to-SQL 或实体框架查询的一部分(其他 ORM 显然也支持表达式语法,但我认为它们的使用率不会像 EF 或 L2S 那样高)。我认为 StackOverflow 上的绝大多数“LINQ”问题都引用了这两个框架之一(EF 开始占据多数份额,但 L2S 并没有懈怠)。
      猜你喜欢
      • 1970-01-01
      • 2012-11-15
      • 1970-01-01
      • 1970-01-01
      • 2020-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多