C# 8.0、.NET Framework 4.8與NET Standard 2.1的一個說明
https://blog.csdn.net/sD7O95O/article/details/84609820
早在本月12日,微軟官方的.NET Blog發布了一篇名為《Building C# 8.0》的文章,介紹了很多C# 8.0的新特性。不過本文主要討論的並不是C# 8.0的新特性,而是存在於這篇文章中的一段文字:
Most of the C# 8.0 language features will run on any version of .NET. However, a few of them have platform dependencies.
Async streams, indexers and ranges all rely on new framework types that will be part of .NET Standard 2.1. As Immo describes in his post Announcing .NET Standard 2.1, .NET Core 3.0 as well as Xamarin, Unity and Mono will all implement .NET Standard 2.1, but .NET Framework 4.8 will not. This means that the types required to use these features won’t be available when you target C# 8.0 to .NET Framework 4.8.
這里的文字說的是,文中所介紹的絕大部分C# 8.0的新特性都可以在任何版本的.NET上使用,唯獨有個別的功能需要在特定版本的.NET上才能使用。比如,Async streams,indexers and ranges這些特性都需要依賴於由.NET Standard 2.1引入的新類型,根據Immo在他的博客中所述,.NET Core 3.0、Xamarin、Unity以及Mono都會實現.NET Standard 2.1,而.NET Framework 4.8卻不會。這也就意味着,這些C# 8.0的新特性,無法在目標框架為.NET Framework 4.8的情況下使用,也就是說,這些C# 8.0的新特性,無法在經典的.NET環境中使用。如此看來,貌似與以前展示的.NET平台架構有所出入,因為新版本的.NET Framework並不實現.NET Standard 2.1。
我在2018年3月24日上海MVP線下技術交流活動中,分享過C#7.x的新特性,並且做了一場演示,展示了將C# 7.2 target到.NET Framework 2.0的工程,並在2.0的工程中使用C# 7.2的語法特性進行開發。由此看來,這是完全可行的,前提是,我所使用的開發庫必須是可基於CLR 2.0運行的。你會發現,即使我使用C# 7.2,我仍然無法在一個2.0的工程中使用async/await的異步框架,原因是,async/await所依賴的TPL只能運行在4.0的CLR上,因此,C# 7.2可以target到.NET Framework 2.0,但是有一部分語言特性無法使用,這種情況同樣發生在上面的C# 8.0上。
據此分析,.NET Standard 2.1引入新的API(比如Span<>)需要修改.NET的公共語言運行時(Common Language Runtime,CLR),這樣的修改,對於.NET Core、Xamarin、Unity以及Mono這些重新設計的框架來說,應該更為方便;而對於經典.NET Framework這種具有歷史特點的框架來說,或許並不那么直接容易,所以,.NET團隊推后了經典.NET CLR的變更計划,由此也就推后了.NET Framework對於C# 8.0新特性的支持計划,因此,.NET Framework 4.8仍然只支持.NET Standard 2.0,部分C# 8.0的新特性無法使用。
經典.NET Framework的公共語言運行時(CLR)在整個.NET的發展進程中也就只出現過4個版本:1.0/1.1/2.0/4.0。 1.0和1.1基本上可以忽略不計了,估計現在已經沒有什么項目在用這兩個版本相對應的.NET Framework了。讓大家最為熟知的是.NET CLR 2.0和4.0的版本:CLR 2.0隨着Visual Studio 2005的發布,直到Visual Studio 2010的CLR 4.0,一共有5年時間;而2010年隨着Visual Studio 2010一起發布的.NET CLR 4.0,至今也有近9年的歷史了。隨着.NET Standard API的不斷擴展,相信不久的將來,我們會迎來一次CLR的版本升級,使得經典.NET Framework能夠更好地支持.NET Standard API以及新的編程語言特性,契合整個.NET的平台架構。
原文地址:http://sunnycoding.cn/2018/11/27/csharp8-net-framework-4-8-and-net-standard-2-1-side-note/