.NET 6新特性试用 | 隐式using指令
前言
在使用《最小Web API》時(shí),我們發(fā)現(xiàn),相比以前的代碼,大量的using指令消失了:
using指令的主要作用是允許使用在命名空間中定義的類(lèi)型,而無(wú)需指定該類(lèi)型的完全限定命名空間。
那么,在.NET 6下為什么不需要了呢?
ImplicitUsings屬性
遍歷項(xiàng)目下的所有文件,最后在csproj中找到這樣一個(gè)屬性,應(yīng)該和using指令相關(guān):
將屬性值改成disable,則編譯失敗:
需要在文件頂部加上using指令:
也就是說(shuō),編譯時(shí)其實(shí)還是需要using指令的。
那它們寫(xiě)在哪了?
global using指令
打開(kāi)obj目錄(用于存放編譯過(guò)程中生成的中間臨時(shí)文件),在cs文件的對(duì)應(yīng)目錄發(fā)現(xiàn)了WebApplication1.GlobalUsings.g.cs文件:
原來(lái)using都寫(xiě)在這里了:
//?<auto-generated/> global?using?global::Microsoft.AspNetCore.Builder; global?using?global::Microsoft.AspNetCore.Hosting; global?using?global::Microsoft.AspNetCore.Http; global?using?global::Microsoft.AspNetCore.Routing; global?using?global::Microsoft.Extensions.Configuration; global?using?global::Microsoft.Extensions.DependencyInjection; global?using?global::Microsoft.Extensions.Hosting; global?using?global::Microsoft.Extensions.Logging; global?using?global::System; global?using?global::System.Collections.Generic; global?using?global::System.IO; global?using?global::System.Linq; global?using?global::System.Net.Http; global?using?global::System.Net.Http.Json; global?using?global::System.Threading; global?using?global::System.Threading.Tasks;global using的官方文檔說(shuō)明如下:
向 using 指令添加 global 修飾符意味著 using 將應(yīng)用于編譯中的所有文件(通常是一個(gè)項(xiàng)目)
也就是說(shuō),對(duì)于任何命名空間,無(wú)需再在每個(gè)文件上寫(xiě)using指令,只需在一個(gè)文件中寫(xiě)global using指令即可。
而WebApplication1.GlobalUsings.g.cs文件是基于ImplicitUsings屬性設(shè)置自動(dòng)生成的。
那么,為啥會(huì)自動(dòng)包含這些命名空間呢?
GenerateGlobalUsings任務(wù)
使用MSBuild Structured Log Viewer(使用方法請(qǐng)參看《天吶!你知道MSBuild都干了些什么》)查看MSBuild的輸出日志,可以看到WebApplication1.GlobalUsings.g.cs文件是由GenerateGlobalUsings任務(wù)生成的:
而任務(wù)參數(shù)數(shù)據(jù)來(lái)源于Using參數(shù):
<GenerateGlobalUsings?Usings="@(Using)"><Output?TaskParameter="Lines"?ItemName="_GlobalUsingLines"?/> </GenerateGlobalUsings>而具體值來(lái)源于項(xiàng)目引用的SDK:
結(jié)論
了解原理后,我們可以使用項(xiàng)目文件,即可增加我們的自定義global using:
<ItemGroup><Using?Include="GlobalUsingDemo"?/> </ItemGroup>利用隱式using指令,再也不用在cs文件中寫(xiě)using指令了!
如果你覺(jué)得這篇文章對(duì)你有所啟發(fā),請(qǐng)關(guān)注我的個(gè)人公眾號(hào)”My IO“
總結(jié)
以上是生活随笔為你收集整理的.NET 6新特性试用 | 隐式using指令的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C# WPF MVVM模式Prism框架
- 下一篇: WPF 透明窗口在桌面上放虫子。。。