2

我认为 C# 语言编译器是一个自包含的黑匣子,能够理解特定语法的文本并生成编译代码。另一方面,.NET 框架是一个庞大的库,其中包含部分由 C# 和部分由 C++ 编写的功能。所以 .NET 框架依赖于 C# 语言,而不是相反。

但我无法将其融入 LINQ 的工作方式。LINQ 查询是 C# 编译器可以理解的特定语法的文本。但是要通过自己的 LINQ 提供程序构建,我需要使用 IQueryable 和 IQueryProvider 等接口,这两个接口都在框架的 System.Linq 命名空间中定义。

这是否意味着 C# 语言提供的功能依赖于 .NET 框架的一部分?C# 语言是否了解 .NET 框架?

4

2 回答 2

8

.NET Framework 包含许多部分。其中最重要的一项是 CLR — 公共语言运行时。所有 .NET 语言都依赖它,包括 C#,因为它们产生的 IL 代码不能由机器处理器执行。相反,CLR 执行它。

还有基础类库 BCL,可用于每种 .NET 语言:C#、VB.NET、托管 C++、F#、IronRuby,应有尽有。我怀疑它是用 C# 编写的。它不依赖于这些语言的任何特性,因为类和 OOP 是在 CLR 中构建的。

所以,是的,C# 语言了解 .NET 框架,它绝对必须了解它。想一想IEnumerable:要编译foreachGetEnumerator()MoveNext()调用,C# 编译器必须知道,嗯,IEnumerable存在。而且有些特别。

或者考虑属性!AttributeC# 编译器具有关于接口提供什么方法​​的内在知识。

但是CLR本身对C#一无所知。完全没有。

于 2012-12-26T10:39:09.753 回答
7

LINQ 查询是 C# 编译器可以理解的特定语法的文本。

好吧,查询表达式是 - 但编译器并没有真正“理解”它们。它只是以一种非常机械的方式翻译它们。例如,采取以下查询:

var query = from foo in bar
            where foo.X > 10
            select foo.Y;

也就是翻译成:

var query = bar.Where(foo => foo.X > 10)
               .Select(foo => foo.Y);

编译器对这里的内容和含义一无所知。它们甚至不必是方法——如果你有适当的字段或委托类型的属性,编译器就可以了。基本上,如果第二种形式可以编译,那么查询表达式也可以。WhereSelect

大多数 LINQ 提供程序使用扩展方法来提供这些方法(WhereSelectSelectMany)。同样,它们只是 C# 语言的一部分——编译器不知道也不关心扩展方法的作用

有关如何翻译查询表达式的更多详细信息,请参阅我的 Edulinq 博客系列的第 41 部分。您可能会发现我的 Edulinq 系列的其余部分也提供了丰富的信息 - 它基本上是一系列博客文章,我在其中重新实现了 LINQ to Objects,一次一个方法。同样,这表明 C# 编译器不依赖System.Linq命名空间中的 LINQ 实现或类似的东西。

于 2012-12-26T10:38:50.887 回答