C# 8.0本质论
上QQ阅读APP看书,第一时间看更新

1.6 多个.NET框架

本章之前说过,目前存在多个.NET框架。Microsoft的宗旨是在最大范围的操作系统和硬件平台上提供.NET实现,表1.3列出了最主要的实现。

表1.3 主要.NET Framework实现

除非特别注明,否则本书所有例子都兼容.NET Core和Microsoft .NET Framework。但由于.NET Core才是.NET的未来,所以本书配套代码(从http://github.com/IntelliTect/EssentialCSharphttp://bookzhou.com下载)都配置成默认使用.NET Core。

注意 全书都用“.NET框架”指代.NET实现所支持的任何框架。相反,用“Microsoft .NET Framework”指代只在Windows上运行,最初由Microsoft在2001年发布的.NET框架实现。

1.6.1 应用程序编程接口

数据类型(比如System.Console)的所有方法(常规地说是成员)定义了该类型的应用程序编程接口(Application Programming Interface,API)。API定义软件如何与其他组件交互,所以单独一个数据类型还不够。通常,是一组数据类型的所有API结合起来为某个组件集合创建一个API。以.NET为例,一个程序集中的所有类型(及其成员)构成了该程序集的API。类似地,.NET Core或Microsoft .NET Framework中的所有程序集构成了更大的API。通常将这一组更大的API称为框架,所以我们用“.NET框架”一词指代.NET Core或Microsoft .NET Framework的所有程序集公开的API。API通常包含一组接口和协议(或指令),帮助你使用一系列组件进行编程。事实上,对于.NET来说,协议本身就是.NET程序集的执行规则。

1.6.2 C#和.NET版本控制

.NET框架的开发周期有别于C#语言,这造成底层.NET框架和对应的C#语言使用了不同的版本号。例如,使用C# 5.0编译器将默认基于Microsoft .NET Framework 4.6来编译。表1.4简单总结了Microsoft .NET Framework和.NET Core的C#和.NET版本。

表1.4 C#和.NET版本

随C# 6.0增加的最重要的一个框架功能或许是对跨平台编译的支持。换言之,不仅能用Windows上运行的Microsoft .NET Framework编译,还能使用Linux和macOS上运行的.NET Core实现来编译。虽然.NET Core的功能比完整的Microsoft .NET Framework少,但足以使整个ASP.NET网站在非Windows和IIS的系统上运行。这意味着同一个代码库可编译并执行在多个平台上运行的应用程序。.NET Core是一套完整的SDK,包含从.NET Compiler Platform(即“Roslyn”,本身在Linux和macOS上运行)到.NET Core“运行时”的一切,另外还提供了像dotnet命令行实用程序(dotnet CLI,自C# 7.0引入)这样的工具。

1.6.3 .NET Standard

有这么多不同的.NET实现,每个.NET框架还有这么多版本,而且每个实现都支持一套不同的、但多少有点重叠的API,这造成框架分叉得越来越厉害。这增大了写跨.NET框架可重用代码的难度,因为要检查特定API是否支持。为降低复杂度,微软推出了.NET Standard来定义不同版本的标准应支持哪些API。换言之,要相容于某个.NET Standard版本,.NET框架必须支持该标准所规定的API。但由于许多实现已经发布,所以哪个API要进入哪个标准的决策树在一定程度上基于现有实现及其与.NET Standard版本号的关联。

写作本书时最新发布的.NET标准为2.1版,但遗憾的是,最新的.NET Framework 4.8仍然执行.NET Standard 2.0,这意味着它不支持C# 8.0里面的范围、索引和异步流。不过除此之外,.NET Framework 4.8中的所有基础框架都实现了.NET Standard 2.0,这意味着它不但为所有的旧API统一了执行标准,而且使得采用了.NET Standard 2.0的应用程序可以跨平台编译。

在微软的计划中,不同版本的.NET Framework源代码都将会被合并到.NET Core 5.0代码库中,这使得未来的.NET Core 5.0将成为一个集.NET Framework、.NET Core和Xamarin/Mono于一体的整合产品。到那时,.NET标准将会失去意义。换句话说,将来我们不再需要注意哪些API执行的是哪一个标准,因为.NET Framework都将来自同一个代码库,并且它们的API都执行完全相同的标准。若要了解更多的信息,请访问网站http://itl.tc/net5unification