C# 表达式vs Lambdas
我知道什么是Lambda表达式 但我不确定这是否与C# 表达式vs Lambdas,c#,.net,expression,C#,.net,Expression,我知道什么是Lambda表达式 但我不确定这是否与表达式相同。这里要知道的似乎比我知道的要多 我正在看一本书,它使用了很多表达方式。例如,这里的“Expression”参数是否比Lambda中的参数更多 public InterceptedQuery(InterceptingProvider provider, Expression expression) { this._provider = provider; this._expression = expression;
表达式
相同。这里要知道的似乎比我知道的要多
我正在看一本书,它使用了很多表达方式。例如,这里的“Expression”参数是否比Lambda中的参数更多
public InterceptedQuery(InterceptingProvider provider, Expression expression)
{
this._provider = provider;
this._expression = expression;
}
lambda表达式是一种编译器功能,它根据上下文编译为以下两种内容之一:
- 一个(隐藏的)函数及其委托
表达式
表达式以可检查的形式封装和表达应用程序逻辑(换句话说,它允许您查看开发人员根据调用的属性和函数、包含的常量、比较等编写的内容)。这就是查询提供程序(大多数情况下是实体框架等对象关系映射程序)将代码转换为SQL的方式。lambda通常是编译代码,其中表达式表示“抽象语法树”(AST),即表示代码的数据结构,可以编译为代码。IQueryable通常对表达式进行操作,因为它应该将AST编译为在不同环境(如SQL server)中运行的代码,而不仅仅是在主机上运行。有IQueryableProviders可编译为SQL(Linq2Sql)、JavaScript、OpenGL着色器(Bling)等 如果方法参数需要正确类型的表达式,C#编译器有时可以将lambda转换为表达式:
void Foo(Expression<Func<int>>) { ... }
...
Foo(() => 3);
void Foo(表达式){…}
...
Foo(()=>3);
“lambda通常是编译代码”这是不正确的,虽然lambda肯定可以用来创建编译代码(它们成为隐藏的、编译器生成的函数的委托),但它们也可以用来创建表达式
对象;无论创建哪一个,都取决于上下文。我不打算投反对票,因为你关于AST的信息肯定是正确的,但第一句话暗示了Lambdas和表达式之间存在差异。重点放在一般意义上。lambdas的全部表达能力目前仅对代理可用,因为“语句lambdas”无法编译为表达式。表达式是lambdas的贫乏子集。我还估计lambda使用的大多数是System.Linq,它使用委托,但也许我对这个估计有偏见;我认为大多数LINQ语句都是LINQtoSQL或实体框架查询的一部分(其他ORM显然也支持表达式语法,但我不认为它们的使用率接近EF或L2S)。我认为,关于StackOverflow的绝大多数“LINQ”问题都参考了这两个框架中的一个(EF开始占据多数,但L2S并不是无精打采的)。