Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 表达式vs Lambdas_C#_.net_Expression - Fatal编程技术网

C# 表达式vs Lambdas

C# 表达式vs Lambdas,c#,.net,expression,C#,.net,Expression,我知道什么是Lambda表达式 但我不确定这是否与表达式相同。这里要知道的似乎比我知道的要多 我正在看一本书,它使用了很多表达方式。例如,这里的“Expression”参数是否比Lambda中的参数更多 public InterceptedQuery(InterceptingProvider provider, Expression expression) { this._provider = provider; this._expression = expression;

我知道什么是Lambda表达式

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

我正在看一本书,它使用了很多表达方式。例如,这里的“Expression”参数是否比Lambda中的参数更多

public InterceptedQuery(InterceptingProvider provider, Expression expression) 
{ 
    this._provider = provider; 
    this._expression = expression; 
}  
lambda表达式是一种编译器功能,它根据上下文编译为以下两种内容之一:

  • 一个(隐藏的)函数及其委托
  • 表达式
一旦应用程序被编译,lambda表达式的概念就不存在了,因为它已经变成了上面两个选项之一

我不知道你说的是什么意思

这里的“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并不是无精打采的)。