亚洲乱色熟女一区二区三区丝袜,天堂√中文最新版在线,亚洲精品乱码久久久久久蜜桃图片,香蕉久久久久久av成人,欧美丰满熟妇bbb久久久

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

[點(diǎn)晴永久免費(fèi)OA].NET科普:.NET簡(jiǎn)史、.NET Standard以及C#和.NET Framework之間的關(guān)系

freeflydom
2024年7月19日 17:26 本文熱度 2370

 

最近在不少自媒體上看到有關(guān).NET與C#的資訊與評(píng)價(jià),感覺(jué)大家對(duì).NET與C#還是不太了解,尤其是對(duì)2016年6月發(fā)布的跨平臺(tái).NET Core 1.0,更是知之甚少。在考慮一番之后,還是決定寫點(diǎn)東西總結(jié)一下,也回顧一下.NET的發(fā)展歷史。

首先,你沒(méi)看錯(cuò),.NET是跨平臺(tái)的,可以在Windows、Linux和MacOS以及它們的各個(gè)發(fā)行版上運(yùn)行,不僅如此,從2022年4月28日開(kāi)始,.NET開(kāi)源社區(qū)正式支持國(guó)產(chǎn)龍芯芯片龍架構(gòu)(LoongArch),這使得.NET在國(guó)家信創(chuàng)這一領(lǐng)域又邁出了一大步。咦?.NET跨平臺(tái)這事情我知道呀,為何要特別提起呢?因?yàn)?strong style="margin: 0px; padding: 0px;">真的有很多人不知道,而且不乏各種短視頻平臺(tái)里出現(xiàn)的各種技術(shù)專家和技術(shù)大咖,紛紛表示.NET只能在Windows上運(yùn)行,跨平臺(tái)困難,落地和部署困難。

其次,.NET的成功案例有很多,大家都知道,.NET和C#會(huì)用在游戲開(kāi)發(fā)、工控領(lǐng)域、老系統(tǒng)維護(hù)等項(xiàng)目和場(chǎng)景中,卻并不了解其實(shí)下面這些也都是.NET的成功案例,或者有著.NET的影子:

  1. Stackoverflow - 全球最大技術(shù)問(wèn)答網(wǎng)站

  2. Microsoft Azure - 微軟云平臺(tái)

  3. 博客園 - 就是本站

  4. Microsoft Bing - 微軟搜索引擎

  5. Office 365

  6. Azure DevOps

  7. GoDaddy

  8. Trello

  9. DocuSign

  10. Github的部分后端服務(wù) - 說(shuō)明一下,Github主要是Ruby on Rails實(shí)現(xiàn)的,可是還有短視頻博主說(shuō)Ruby語(yǔ)言快死了

在上面的列表中,有些可能你還不認(rèn)識(shí),剩下的認(rèn)識(shí)的大部分都是微軟自己的產(chǎn)品,你會(huì)說(shuō).NET只有微軟自己用,但不管是誰(shuí)用,這些站點(diǎn)和應(yīng)用都是超大規(guī)模級(jí)別的,說(shuō)明使用.NET來(lái)構(gòu)建超大規(guī)模級(jí)別的大型應(yīng)用是完全沒(méi)有問(wèn)題的:容器化、云原生、微服務(wù)、Serverless,.NET都可以勝任;AI時(shí)代,ML.NET、Semantic Kernel、LLamaSharp、Cognitive Services等等.NET原生框架和開(kāi)發(fā)SDK,在微軟Azure OpenAI Services的加持下,為.NET在AI領(lǐng)域發(fā)力提供了更多的機(jī)會(huì)。

此外,.NET是開(kāi)源的,.NET的各個(gè)部分通過(guò)不同的Repository維護(hù)在Github上,這些倉(cāng)儲(chǔ)基本上都是以MIT和Apache 2的許可協(xié)議進(jìn)行開(kāi)源,由微軟員工作為主要貢獻(xiàn)者,因此,在開(kāi)源的同時(shí),又保證了倉(cāng)儲(chǔ)的持續(xù)更新維護(hù)和提交代碼的質(zhì)量。不僅如此,.NET Foundation還收納了不少知名開(kāi)源項(xiàng)目,這對(duì)完善整個(gè).NET生態(tài)起到了非常積極的作用。

那這里的.NET是指.NET Framework嗎?算是,但也不完全是。之前為大家熟知的那個(gè)只能在Windows下運(yùn)行的版本,稱為.NET Framework,自2016年開(kāi)始,微軟發(fā)布跨平臺(tái)版本的.NET框架時(shí),它作為經(jīng)典.NET Framework的跨平臺(tái)版本,被稱之為.NET Core,.NET Core延續(xù)到3.1版之后,被改名為.NET 5,然后就是后來(lái)的6、7、8、9等各個(gè)版本。對(duì)于這部分內(nèi)容,我后面會(huì)介紹,但我想在介紹更多詳細(xì)信息之前,先簡(jiǎn)單地回顧一下.NET的歷史。

.NET極簡(jiǎn)史:從Visual J++開(kāi)始

大家都知道,剛剛退休的Java之父詹姆斯·高斯林曾經(jīng)在1991年就開(kāi)始參與Java語(yǔ)言的構(gòu)建,然后Sun Microsystems公司于1996年發(fā)布了Java 1.0版本,但很少有人知道,微軟在同年10月份發(fā)布了自己的Java語(yǔ)言:Visual J++。Visual J++開(kāi)發(fā)的程序基于微軟自研的MSJVM運(yùn)行,雖然J++遵循Java語(yǔ)言規(guī)范,但微軟并沒(méi)有選擇完全根據(jù)Sun公司的Java規(guī)范來(lái)設(shè)計(jì)自己的JVM,于是,MSJVM實(shí)際上并不完全支持Sun Java的所有能力,包括Java RMI和JNI。而另一方面,微軟還在Visual J++中加入了一些自己的設(shè)計(jì),比如通過(guò)回調(diào)函數(shù)和委托來(lái)實(shí)現(xiàn)事件處理,這就使得Visual J++變得更像另一種新的編程語(yǔ)言。不僅如此,Visual J++在訪問(wèn)系統(tǒng)資源方面,也不遵循Sun Java SDK規(guī)范,而是通過(guò)自己定義的J/Direct接口來(lái)讓代碼直接訪問(wèn)操作系統(tǒng)層面的API,于是,Visual J++在某些方面性能要大大優(yōu)于Sun Java(很是懷疑這個(gè)J/Direct就是后來(lái)的P/Invoke)。從技術(shù)角度,使用了這些特殊功能的J++應(yīng)用程序其實(shí)無(wú)法在Sun Java JVM上運(yùn)行,不過(guò)當(dāng)時(shí)也有不少開(kāi)源項(xiàng)目,比如Kaffe項(xiàng)目,它們可以使J++應(yīng)用程序無(wú)需移植即可直接在這些開(kāi)源的JVM上運(yùn)行。但這些開(kāi)源項(xiàng)目也最終沒(méi)有被廣泛應(yīng)用。

一開(kāi)始的時(shí)候,Sun公司愿意在Java語(yǔ)言上與微軟合作,而由于Visual J++里的各種騷功能和騷設(shè)計(jì)打破了Sun Java規(guī)范,以至于MSJVM未能通過(guò)Sun公司的合規(guī)性測(cè)試,于是,在Sun公司的起訴下,微軟逐漸停止了Visual J++的研發(fā)。不過(guò),在這個(gè)過(guò)程中,微軟積累了豐富的技術(shù)和經(jīng)驗(yàn),這些技術(shù)和經(jīng)驗(yàn)逐漸演化成后來(lái)的.NET平臺(tái)和Visual J#(一種可以運(yùn)行在.NET Framework上的Java編程語(yǔ)言,注意:是編程語(yǔ)言,就是用Java的語(yǔ)法寫.NET Framework的應(yīng)用程序)。Visual J#是Visual J++的續(xù)作,目的是能夠讓原來(lái)的Visual J++開(kāi)發(fā)人員可以平滑地遷移到.NET平臺(tái)上。

之后就是2002年4月15日發(fā)布的.NET Framework 1.0和Visual Studio.NET 2002(注意是Visual Studio.NET,不是Visual Studio,從Visual Studio 2005開(kāi)始,名字里去掉了.NET字樣),它可以安裝并運(yùn)行在Windows NT 4.0 SP6、Windows 98、Windows 98 SE、Windows ME、Windows 2000和Windows XP系統(tǒng)上。當(dāng)年我正好讀大三,記得數(shù)據(jù)庫(kù)這門課的課程設(shè)計(jì),就是用Visual Studio.NET 2002做的。由于操作系統(tǒng)可以是32或者64位的,屬于不同的CPU架構(gòu),因此,從這個(gè)層面也可以說(shuō).NET是跨平臺(tái)的:在Windows操作系統(tǒng)下跨平臺(tái)。說(shuō)起跨平臺(tái),雖然一開(kāi)始由于市場(chǎng)策略、技術(shù)實(shí)現(xiàn)、開(kāi)源生態(tài)等等因素,微軟最終選擇讓.NET只在Windows下運(yùn)行,但同時(shí)也力求將各種設(shè)計(jì)通過(guò)ISO和ECMA進(jìn)行標(biāo)準(zhǔn)化,這為后續(xù)社區(qū)版跨平臺(tái).NET Framework:Mono Project、Xamarin以及.NET Core的出現(xiàn),打下了堅(jiān)實(shí)的基礎(chǔ)。

值得一提的是,由于CLI標(biāo)準(zhǔn)化的存在,使得任何編程語(yǔ)言,只要符合相關(guān)規(guī)范,都可以在.NET上運(yùn)行(這里我就不區(qū)分跨平臺(tái).NET還是經(jīng)典.NET Framework了,單說(shuō)編程語(yǔ)言這部分內(nèi)容,兩者原理是一樣的),于是,你可能會(huì)看到有人使用以下語(yǔ)言來(lái)開(kāi)發(fā).NET應(yīng)用程序:

從2002年4月15日到2022年8月9日這20年時(shí)間,.NET Framework經(jīng)歷了大大小小17個(gè)版本,功能也在不斷的增強(qiáng),在2016年隨著.NET Standard的引入,從.NET Framework 4.5開(kāi)始,不同版本的.NET Framework也被歸屬到對(duì)應(yīng)版本的.NET Standard之下,而發(fā)布于2019年4月18日的.NET Framework 4.8,也成為了經(jīng)典.NET Framework的最后一個(gè)版本(雖然2022年8月9日發(fā)布了.NET Framework 4.8.1,但并不是一個(gè)主版本)。

后續(xù)版本的.NET被稱為.NET 5,從版本號(hào)上可以看到,.NET 5可以看成是.NET Framework 4.8的延續(xù),它去掉了“Framework”字樣,以示與之前經(jīng)典.NET Framework的區(qū)別,.NET 5及后續(xù)版本都是跨平臺(tái)的,現(xiàn)在回看這段歷史可以發(fā)現(xiàn),之前的.NET Core 1.0到3.1其實(shí)都是.NET跨平臺(tái)歷程的中間版本,這些版本存在的價(jià)值,就是讓.NET開(kāi)發(fā)人員和用.NET Framework開(kāi)發(fā)的項(xiàng)目可以通過(guò)這些.NET Core的版本,能夠無(wú)縫地、逐步地過(guò)渡到跨平臺(tái)的、現(xiàn)代化的.NET上。不得不佩服微軟在.NET跨平臺(tái)這方面無(wú)論在市場(chǎng)戰(zhàn)略上,還是技術(shù)戰(zhàn)術(shù)上,都表現(xiàn)得非常出色。

.NET歷史就介紹這么點(diǎn),了解這些基本也就夠了,接下來(lái)我會(huì)逐步從技術(shù)角度,來(lái)介紹一些與.NET相關(guān)的新概念。

.NET跨平臺(tái)與.NET Standard

可以這樣理解:.NET Standard是.NET跨平臺(tái)的基礎(chǔ)。.NET Standard其實(shí)就是一套.NET下的API規(guī)范,它的第一個(gè)版本與2016年的.NET Core 1.0同時(shí)發(fā)布,每一個(gè)版本的.NET Standard都規(guī)定了實(shí)現(xiàn)這一版本規(guī)范的不同的.NET實(shí)現(xiàn)應(yīng)該包含哪些API。更具體些:為了跨Linux、MacOS、Windows、iOS、Android等多個(gè)平臺(tái),.NET會(huì)針對(duì)這些平臺(tái)提供不同的實(shí)現(xiàn),這些實(shí)現(xiàn)包括:.NET Core、.NET Framework、Xamarin套件(iOS、Mac和Andriod)、用于游戲開(kāi)發(fā)的Unity下的.NET等等,如果這些實(shí)現(xiàn)能夠遵循某個(gè)版本的API標(biāo)準(zhǔn),那么,基于這個(gè)版本的API標(biāo)準(zhǔn)所開(kāi)發(fā)的應(yīng)用程序,就可以運(yùn)行于這些不同平臺(tái)上,而這套API標(biāo)準(zhǔn)就是.NET Standard。另一方面,如果希望開(kāi)發(fā)出來(lái)的類庫(kù)和組件能夠被不同平臺(tái)的應(yīng)用程序使用,那么,只需要指定這個(gè)類庫(kù)和組件所基于的.NET Standard版本即可。

然而,最開(kāi)始的.NET Framework并不能跨平臺(tái),微軟為了逐步實(shí)現(xiàn).NET跨平臺(tái)這個(gè)目標(biāo),先后發(fā)布了從1.0到2.1一共9個(gè)版本的.NET Standard,每個(gè).NET Standard版本下,都增加一部分.NET API的支持,比如,.NET Standard 1.0僅支持37118個(gè)API中的7949個(gè),.NET Standard 2.0支持37118個(gè)API中的32638個(gè),而最新的.NET Standard 2.1則支持所有37118個(gè)API。因此,在不同版本的.NET Standard下,就會(huì)有對(duì)應(yīng)版本的.NET實(shí)現(xiàn)對(duì)其進(jìn)行支持。比如對(duì)于.NET Standard 2.0,經(jīng)典的.NET Framework需要4.6.1及以上的版本才支持.NET Standard 2.0,因?yàn)檫@些版本實(shí)現(xiàn)了.NET Standard 2.0中所定義的那32638個(gè)API。于是,使用.NET Standard 2.0開(kāi)發(fā)的類庫(kù),就可以被.NET Framework 4.6.1所引用。

演練:在不同的.NET項(xiàng)目中使用.NET Standard 2.0類庫(kù)

在Visual Studio 2022中,新建一個(gè).NET Standard 2.0的Class Library:

然后加入一個(gè)類:

再新建一個(gè)經(jīng)典.NET Framework 4.6.1的Console Application:

然后直接引用前面的ClassLibraryNetStandard20類庫(kù)并寫代碼調(diào)用里面的函數(shù),可以看到,程序可以正常運(yùn)行:

當(dāng)然,這個(gè)ClassLibraryNetStandard20也可以被一個(gè).NET 8的應(yīng)用程序調(diào)用:

打開(kāi)這個(gè)ClassLibraryNetStandard20項(xiàng)目的輸出目錄,可以看到,編譯出來(lái)的程序集被放在了Debug\netstandard2.0目錄下:

但是,如果我們新建一個(gè).NET Standard 2.1的Class Library,則無(wú)法被.NET Framework 4.6.1的項(xiàng)目引用,此時(shí)會(huì)報(bào)錯(cuò):

因?yàn)?NET Framework 4.6.1沒(méi)有實(shí)現(xiàn).NET Standard 2.1,換句話說(shuō),.NET Standard 2.1中的有些API在.NET Framework 4.6.1中并沒(méi)有實(shí)現(xiàn),那么基于.NET Standard 2.1開(kāi)發(fā)出來(lái)的類庫(kù)自然也不能被.NET Framework 4.6.1的項(xiàng)目所引用。經(jīng)典.NET Framework的最后一個(gè)版本4.8.1僅實(shí)現(xiàn)了.NET Standard 2.0,因此,如果你打算開(kāi)發(fā)一個(gè)既可以被經(jīng)典.NET Framework項(xiàng)目使用,又可以被跨平臺(tái).NET(曾經(jīng)的.NET Core,現(xiàn)在的.NET 5+)項(xiàng)目使用的話,你需要將你的類庫(kù)定向(targeting)到.NET Standard 2.0,或者使用多目標(biāo)框架(Multi-targeting)。

在【這個(gè)頁(yè)面】中,有一張表,展示了.NET Standard各個(gè)版本與不同的.NET實(shí)現(xiàn)的版本之間的對(duì)應(yīng)關(guān)系,可以通過(guò)下拉框來(lái)選擇不同的.NET Standard版本來(lái)查看不同的.NET實(shí)現(xiàn)的哪些版本與之對(duì)應(yīng)。理論如此,但是在真正實(shí)踐的過(guò)程中,有些具體的問(wèn)題是需要特殊處理的。比如:.NET Framework 4.7是支持.NET Standard 2.0的,但是,.NET Framework 4.7發(fā)布于2017年4月,而.NET Standard 2.0則晚于.NET Framework 4.7發(fā)布(2017年8月),那么如何讓一個(gè)已經(jīng)發(fā)布的.NET Framework版本支持新的.NET Standard呢?解決方案就是使用NuGet Package,將.NET Framework中未實(shí)現(xiàn)的.NET Standard API以NuGet Package的形式引入,從而彌補(bǔ)這個(gè)差異。因此你會(huì)發(fā)現(xiàn),對(duì)于.NET Framework 4.7.1及其以前版本的.NET項(xiàng)目,如果需要引用一個(gè)由.NET Standard 2.0實(shí)現(xiàn)的類庫(kù)的話,就需要額外引用NETStandard.Library這個(gè)Meta Package,這個(gè)Meta Package中包含了不同版本.NET項(xiàng)目所需依賴的Assembly的版本信息。另外,Visual Studio在處理這個(gè)事情上也有差異:

  • Visual Studio 2017 15.3之前的版本需要在IDE中顯式引用這個(gè)Meta Package

  • Visual Studio 2017 15.3開(kāi)始,不再需要在IDE中顯式引用這個(gè)Meta Package,也就是說(shuō),在新建的.NET Framework 4.7.1及以前版本的項(xiàng)目上引用.NET Standard 2.0,不再需要額外去引用NETStandard.Library,Visual Studio會(huì)自動(dòng)幫你完成這個(gè)工作。當(dāng)然,這并不表示你的項(xiàng)目就不需要NETStandard.Library了,只是在IDE的操作上比以前更加簡(jiǎn)單了

在編譯出來(lái)的結(jié)果上也存在差異,下面左圖是一個(gè).NET Framework 4.7的項(xiàng)目引用了一個(gè).NET Standard 2.0的項(xiàng)目后的編譯輸出,右圖是.NET Framework 4.8.1的項(xiàng)目引用了.NET Standard 2.0項(xiàng)目后的編譯輸出,可以看到,4.7的項(xiàng)目編譯后,會(huì)在編譯路徑下生成一堆System DLL,外加一個(gè)netstandard.dll,而4.8.1的項(xiàng)目編譯生成路徑下就非常干凈,因?yàn)?NET Framework 4.8.1已經(jīng)自帶了這些DLL了:

多目標(biāo)框架(Multi-targeting)

盡管.NET Standard提供了不同.NET實(shí)現(xiàn)(.NET Framework、.NET Core和Xamarin等)之間統(tǒng)一的API規(guī)范,但在有些場(chǎng)景下,仍然希望能夠充分利用不同平臺(tái)的特性和性能優(yōu)化,或者需要支持特定平臺(tái)的功能,此時(shí)僅將項(xiàng)目定向到.NET Standard已經(jīng)不能滿足需求。對(duì)于這種場(chǎng)景,.NET允許開(kāi)發(fā)面向多目標(biāo)框架的類庫(kù),一方面可以通過(guò)條件編譯指令來(lái)使用特定平臺(tái)的API,另一方面也可以為類庫(kù)的調(diào)用方提供不同平臺(tái)的支持。

比如,在C#項(xiàng)目文件(.csproj文件)中,使用下面的方式,讓類庫(kù)同時(shí)支持.NET Standard 2.1項(xiàng)目和.NET Framework 4.8的項(xiàng)目:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>

    <TargetFrameworks>netstandard2.1;net4.8</TargetFrameworks>

    <Nullable>enable</Nullable>

    <LangVersion>8.0</LangVersion>

  </PropertyGroup>

</Project>

注意上面的TargetFrameworks標(biāo)記,在這個(gè)XML標(biāo)記下,列出了該類庫(kù)所支持的.NET Standard/.NET Framework的版本,它在編譯之后,會(huì)產(chǎn)生兩個(gè)輸出文件夾,其中包含了支持不同版本.NET的程序集:

另一個(gè)需要注意的地方是,在上面的csproj文件定義中,指定了所使用的C#版本為8.0,這是因?yàn)椤?strong style="margin: 0px; padding: 0px;">可空引用類型”(Nullable Reference Types)是在C# 8.0中引入的,而如果將代碼同時(shí)定向到.NET Framework 4.8,那么就無(wú)法支持可空引用類型,因?yàn)?a target="_blank" rel="noopener" style="margin: 0px; padding: 0px; color: rgb(71, 124, 209); text-decoration-line: none;">.NET Framework 4.8所支持的最高的C#版本為C# 7.3。有關(guān).NET與C#版本之間的關(guān)系,后文我會(huì)介紹。

一個(gè)使用“多目標(biāo)框架”的非常著名的開(kāi)源框架就是log4net。log4net是一個(gè)古老的.NET下的日志輸出工具,它一開(kāi)始是log4j的.NET移植版本,所以,老版本的log4net使用了很多經(jīng)典.NET Framework特有的API,比如System.Configuration命名空間下的基于XML的框架配置代碼。隨著.NET Core和跨平臺(tái).NET的發(fā)布,log4net也逐步提供了對(duì).NET Standard 1.3和.NET Standard 2.0的支持,所以,現(xiàn)在的.NET 5/6/7/8項(xiàng)目都可以直接引用log4net用作日志輸出。在log4net的官方代碼庫(kù)中,可以學(xué)習(xí)到它是如何實(shí)現(xiàn)多目標(biāo)框架的。

事實(shí)上從.NET 5開(kāi)始,.NET真正實(shí)現(xiàn)了跨平臺(tái),.NET Standard也基本完成了它的使命,但.NET Standard并不會(huì)退出歷史舞臺(tái),微軟會(huì)繼續(xù)對(duì)其進(jìn)行維護(hù)。

至此,與.NET跨平臺(tái)和.NET Standard相關(guān)的內(nèi)容就差不多介紹完了,當(dāng)然還有部分細(xì)節(jié)和一些歷史遺留問(wèn)題的處理方式相關(guān)內(nèi)容(比如Portable Class Library,PCLs),這里就不再贅述了,否則篇幅太長(zhǎng),hold不住啊。接下來(lái)我們聊聊C#和.NET Framework之間的關(guān)系吧。

C#語(yǔ)言特性與.NET Framework

如果你是C#語(yǔ)言的初學(xué)者,那么你一定會(huì)產(chǎn)生一個(gè)疑問(wèn):intSystem.Int32有什么區(qū)別?在C#中到底是使用int,還是用System.Int32?其實(shí),C#中的int等價(jià)于System.Int32,也就是說(shuō),你既可以使用int這個(gè)C#關(guān)鍵字來(lái)定義一個(gè)32位有符號(hào)整數(shù)類型的變量,也可以使用System.Int32這個(gè).NET類型來(lái)定義一個(gè)32位有符號(hào)整數(shù)類型的變量。官方文檔上說(shuō)intSystem.Int32別名,但也可以理解為,int是C#能夠支持32位有符號(hào)整數(shù)類型的語(yǔ)言特性

由此可以得出一個(gè)結(jié)論:C#的語(yǔ)言特性是需要.NET Framework(或者.NET)支持的(有些高級(jí)的語(yǔ)言特性甚至需要不同版本的.NET CLR支持),但兩者的版本之間也不一定需要有嚴(yán)格的對(duì)應(yīng)關(guān)系。C#語(yǔ)言特性本質(zhì)上是通過(guò)C#編譯器實(shí)現(xiàn)的,只要編譯輸出的MSIL代碼能夠在.NET Framework(或者.NET)上運(yùn)行起來(lái),那么這些語(yǔ)言特性就可以被該版本的.NET Framework所支持。下面請(qǐng)看一個(gè)具體的案例。

演練:在.NET Framework 4.6.1的項(xiàng)目中使用C# 9.0的新特性

現(xiàn)在我們嘗試在一個(gè).NET Framework 4.6.1(發(fā)布于2015年11月)的項(xiàng)目中,使用C# 9.0(發(fā)布于2020年11月)的新特性。首先新建一個(gè).NET Framework 4.6.1的Console Application:

然后,修改csproj文件,將C#語(yǔ)言版本升級(jí)到C# 9.0:

然后,使用C# 9.0中“關(guān)系型模式匹配”新特性編寫一段代碼:

然后直接運(yùn)行,可以看到,程序是可以正常編譯執(zhí)行的:

那么,是不是所有的C# 9.0的新特性,都可以在.NET Framework 4.6.1中使用呢?答案是否定的,就要看C# 9.0的編譯器是否可以生成能夠被該版本.NET Framework所支持的代碼,或者說(shuō),C#編譯器所生成的代碼中依賴的那些類型,是否在該版本的.NET Framework下支持。舉個(gè)例子,同樣是C# 9.0的新特性,僅限Init的資源庫(kù)新特性則無(wú)法直接在一個(gè).NET Framework 4.6.1的項(xiàng)目中使用,編譯器提示:Predefined type 'System.Runtime.CompilerServices.IsExternalInit' is not defined or imported

原因是,C# 9.0編譯器在編譯帶有這個(gè)新語(yǔ)法特性的代碼時(shí),需要檢查.NET下是否包含IsExternalInit類型,如果該類型存在,則允許使用該語(yǔ)法特性,而該類型在.NET Framework 4.6.1中不存在。因此,解決這個(gè)問(wèn)題,既可以自己在項(xiàng)目中寫一個(gè)空的IsExternalInit類型,或者引用一個(gè)第三方的IsExternalInit NuGet Package。之后就可以正常編譯運(yùn)行代碼了:

請(qǐng)注意:經(jīng)典.NET Framework最高支持到C# 7.3,C# 8.0是專門面向.NET Core的第一個(gè)主要C#版本,它的一些新功能依賴于新的Core CLR的相關(guān)功能?!?a target="_blank" rel="noopener" style="margin: 0px; padding: 0px; color: rgb(71, 124, 209); text-decoration-line: none;">這篇官方文檔】詳細(xì)列舉了C#語(yǔ)言的發(fā)展歷史以及各個(gè)版本的新功能,下面這張表格列舉了不同.NET版本下,創(chuàng)建新項(xiàng)目時(shí)所使用的默認(rèn)的C#語(yǔ)言版本(參考官方文檔):


轉(zhuǎn)自https://www.cnblogs.com/daxnet/p/18299758  作者dax.net



該文章在 2024/7/19 17:29:00 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved