Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# C编译器看到流畅的语法还是查询表达式?_C#_Linq_.net 4.0 - Fatal编程技术网

C# C编译器看到流畅的语法还是查询表达式?

C# C编译器看到流畅的语法还是查询表达式?,c#,linq,.net-4.0,C#,Linq,.net 4.0,我总是对这些东西感到困惑 我有一个疑问: string[] names = { "Tom", "Dick", "Harry", "Mary", "Jay" }; IEnumerable<string> query = names.Where(n => n.Contains("a")) .OrderBy(n => n.Length) .Select(n => n.ToUpper()); 我在一篇文章中读到: 编译器通过将查询表达式转换为 流畅的语法 但在反射器中,

我总是对这些东西感到困惑

我有一个疑问:

string[] names = { "Tom", "Dick", "Harry", "Mary", "Jay" };

IEnumerable<string> query = names.Where(n => n.Contains("a"))
.OrderBy(n => n.Length)
.Select(n => n.ToUpper());
我在一篇文章中读到:

编译器通过将查询表达式转换为 流畅的语法

但在反射器中,我看到了相反的情况:

这不是流利的语法


那么编译器看到了什么呢?

查询理解语法直接编译成方法调用;它们产生难以区分的IL

然而,许多反编译器总是将LINQ调用转换为查询理解语法。 您可能可以在选项中更改该行为。

stock csc编译器将任何和所有语法转换为IL、fluent或其他格式。你看到的是反射器选择的重建

某些语法对于更复杂的结构来说只是糖衣,而。其他示例包括和


现在,如果这是LINQ to SQL或Entities,那么查询语法和fluent语法将作为表达式实现,并由提供者在后台进行翻译。这与L2O中的不同。

我相信你是在反向阅读,但我可能弄错了

它说的是

from n in names
where n.Contains("a")
orderby n.Length
select n.ToUpper()
转化为

names
.Where(n => n.Contains("a"))
.OrderBy(n => n.Length)
.Select(n => n.ToUpper());

我认为说一本流利的语法书就意味着对林克奎尔的理解。 只有在实际请求数据时,才会根据之前完成的所有查询(如果有)生成查询。之前完成的所有查询都将进行分析,如果可能,将生成一个优化的LINQ查询以获取数据


从最终结果的角度来看,就像其他人所说的那样,它总是最终成为一组IL指令。

根据定义,编译器是一种将用一种语言编写的文本翻译成另一种语言的设备

C编译器从逻辑上将包含查询表达式的C程序转换为不带查询表达式的C程序,然后将这些程序转换为IL。注意,它实际上不需要做翻译的中间阶段;它的行为必须像这样,但如果编译器编写者足够聪明,跳过了中间步骤,仍然得到了正确的输出,那么我们当然可以这样做

Reflector也是一个编译器。它将IL翻译成C。它是如何做到这一点的是它的业务


基于Reflector的输出,您无法对C编译器的工作做出任何结论;它们是完全不同的程序,由不同的人编写,以解决不同的问题

反射器向你展示它想让你看到的东西@因此编译器通过将查询表达式转换为流畅的语法来处理查询表达式。这是否意味着IL是基于流畅的语法构建的?@RoyiNamir:一个非常模糊的问题,没有意义-1.@Tigran我想你没有打开linq。我能处理你的-1。我在哪里能看到它真正翻译成流利的语法?@RoyiNamir:你是什么意思?编译器在Linq to Objects场景中输出IL。我在哪里可以看到它实际转换为流利语法?@RoyiNamir:在ildasm中,或者通过在Reflector中禁用该选项。@RoyiNamir:没有流利语法的概念。我想这只是本书作者的一种表达方式。@SLaks这里没有这样的选择。只对IL和它恭敬的不清楚…:是跳过中间步骤以避免维护两个代码基的部分原因吗?或者这是因为支持L2S/L2EF而产生的?嗨,Eric,那么-根据附加的链接,编译器通过将表达式翻译成流畅的语法来处理它,然后编写它的IL?是吗?@RoyiNamir:是的,没错。查询表达式只是流畅表单的语法糖。如果您感兴趣,C规范有一个部分可以准确地描述转换是什么。