今年11月10号 .NET 5.0 如约而至。这是.NET All in one后的第一个版本,虽然不是LTS(Long term support)版本,但是是生产环境可用的。
有微软的背书,微软从.NET Preview 1就开始在自己的网站上运行.NET 5, (Bing.com、dot.net已升级并运行了数个月),同时早期的.NET Core版本可以直接升级到.NET 5. 所以大家可以放心使用的。
接下来,我们探秘.NET 5.0这次带来了哪些新的特性。
一、.NET 5.0 的一些亮点(Highlights)
1. 通过线上(生产环境)测试(battle-tested) : .NET5.0 通过在Bing.com和dot.net 托管运行数个月,全面通过了线上验证,这证明这个版本是生产可用的
2. 性能大幅提升:GC、JIT、正则表达式、多线程和异步处理、集合、LINQ、网络访问、JSON序列化、gRPC等等,了解详细可以访问
Performance Improvements in .NET 5.0
Arm64 Performance in .NET 5.0
gRPC.
3. C# 9和F# 9 的语音提升:例如C#9的顶级程序和记录,而F#5提供了交互式编程,并提高了.NET上的功能性编程的性能。
4. .NET库增强了Json序列化,正则表达式和HTTP(HTTP 1.1,HTTP / 2)的性能。这一点在第二条中已经有所涉及。
5. P95 的延迟有所减少,得益于GC、分层编译和其他组件的一些改进
6.更好、更灵活的应用部署选项:ClickOnce客户端应用程序发布,单文件应用程序,减小的容器映像大小以及添加的Server Core容器映像。
7.平台支持的范围进一步扩展:Windows Arm64和WebAssembly
二、再看统一平台的愿景
2019年5月6号,微软发布了.NET 5.0 统一平台的愿景:将来只会有一个.NET,您将可以使用它来定位Windows,Linux,macOS,iOS,Android,tvOS,watchOS和WebAssembly等。
实现这一愿景的第一步是整合.NET仓库,即:整合关键的.NET代码库, 其中包括很大一部分的Mono。为.NET运行库和库提供一个存储库是在各处交付相同产品的前提。Blazor是利用代码合并和.NET统一的最佳示例。Blazor WebAssembly的运行时和库现在是从合并的dotnet /运行时仓库中构建的。这意味着服务器上的Blazor WebAssembly和Blazor使用与完全相同的代码List<T>。
代码整合后,.NET Framework怎么办?
.NET Framework仍然是受支持的Microsoft产品,并且每个新版本的Windows都将继续支持.NET Framework。去年,微软宣布已停止向.NET Framework添加新功能,并已向.NET Core添加.NET Framework API。
这就意味着,.NET Framework已经停更了,版面目前停留在.NET Framework 4.8.
这也是没办法的事情,统一后的.NET, 从.NET5.0开始迭代了。这次.NET 5.0的Release列表也能发现这个情况:
在上述情况下,目前是将.NET Framework升级到.NET Core的最佳时机了。如果比较在意LTS版本,也可以等到明年.NET 6统一升级。对于此,微软的建议是:
对于.NET Framework客户端开发人员,.NET 5.0支持Windows窗体和WPF。
对于.NET Framework服务器开发人员, 如果采用ASP.NET Core才能使用.NET 5.0。
对于Web Forms开发人员,Blazor通过高效且更加现代的实现方式提供类似的开发人员体验。
对于WCF服务器和Workflow用户可以查看支持这些框架的社区项目。
以上,对于统一后的.NET 5.0, 广大.NET Developers 可以放心、开心地去拥抱这次升级和统一,这代表了.NET的未来。
三、深入看一下编程语言层面的提升(C# 9 和 F# 5)
C#9和F#5是.NET 5.0版本的一部分,被包含在.NET 5.0 SDK中。接下来详细看一下C# 9 的一些语言新特性(F# 5用的比较少,不再做详细介绍):
1. Top-level programs 顶级程序
大家会问这是什么?这是在顶级编写程序的一种更简单的方式:一个更简单的 Program.cs 文件。
我们知道,原先在Program类中,必须有Main函数,这是程序的一个EntryPoint入口。
using System; namespace NET5Demo { class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); } } }