C# 10 新特性 —— 命名空间的变化
C# 10 新特性 —— 命名空間的變化
Intro
C# 10 針對命名空間做了一些改變,主要是 Global Usings 和 File-scoped Namespace,我們前面分享的示例其實也是用到了這些變化,之前也寫過一篇文章介紹 .NET 6 的隱式命名空間引用 .NET 6 中的隱式命名空間引用,下面我們結合示例著重介紹一下 C# 特性吧
Global Using
有嘗試過 .NET 6 的小伙伴應該都知道了,新的項目模板非常的簡潔
Console 項目模板中 Program.cs 只有一行代碼,沒有 Main 方法,沒有命名空間引用 Console.WriteLine("Hello world")
WebApi 項目也同樣的沒有 Main 方法,沒有命名空間引用
這得益于 C# 的新特性,C# 9 的頂級應用程序使得我們可以消除 Main,而基于 C# 10 中 Global Usings 的隱式命名空間引用使得我們可以不需要聲明部分命名空間
Global using 支持 using 的各種形式,使用示例:
global?using?System; global?using?static?System.Console;?//?static?using global?using?MyFile?=?System.IO.File;?//?alias我們可以在任意一個文件中進行聲明,聲明之后 這個項目 其他文件里用到這里定義的命名空間就可以不需要使用 using 了
新的項目模板中模板文件會有一個 <ImplictUsings>enable</ImplictUsings>,這一屬性就是配置隱式命名空間功能,默認是禁用的,需要顯式配置開啟,對于多個項目的大項目,可以結合我們之前介紹的 Directory.Build.props 來進行項目全局配置?使用 Directory.Build 來消除項目文件中的重復配置
默認引用的命名空間和項目引用的 Sdk 有關,默認的 Microsoft.NET.Sdk 引用了下面這些命名空間
System
System.Collections.Generic
System.IO
System.Linq
System.Net.Http
System.Threading
System.Threading.Tasks
Microsoft.NET.Sdk.Web 在上面的基礎上添加 ASP.NET Core 的一些常用的命名空間引用
System.Net.Http.Json
Microsoft.AspNetCore.Builder
Microsoft.AspNetCore.Hosting
Microsoft.AspNetCore.Http
Microsoft.AspNetCore.Routing
Microsoft.Extensions.Configuration
Microsoft.Extensions.DependencyInjection
Microsoft.Extensions.Hosting
Microsoft.Extensions.Logging
其他項目類型可以參考微軟的文檔
除此之外,我們可以手動的在項目文件中配置自己想要添加的命名空間引用或者移除默認的命名空間引用
命名空間也可以使用變量,如下面的 $(RootNamespace) 表示項目默認的命名空間,使用隱式命名空間引用寫過好多個小示例了,覺得如果項目命名空間包含在默認的命名空間引用里的話可能會更方便,所以提了一個 issue,不過暫時還沒回復,不確定是否會考慮,感興趣的可以參考 https://github.com/dotnet/sdk/issues/22535,這里我就自己配置一下,通過項目文件也可以配置 using static 和 using alias,示例如下
<ItemGroup><Using?Include="$(RootNamespace)"/><Using?Include="WeihanLi.Common.Helpers"/><Using?Include="WeihanLi.Common.Helpers.InvokeHelper"?Static="true"/><Using?Include="WeihanLi.Common.Logging"/><Using?Include="System.IO.File"?Alias="MyFile"/><Using?Remove="System.Net.Http"?/> </ItemGroup>在項目文件中配置的 Using 最終會生成一個 Global Usings 的文件參與到項目的編譯,生成的文件位置在 obj/Debug/net6.0 目錄下,文件名稱是 項目名+ ".GlobalUsings.g.cs",如下圖:
Global Usings outputFile-scoped namespace
除了引用的命名空間,類型的命名空間也發生了變化,針對類型的聲明也做了一些優化,原來我們創建一個類型可能是這樣的
namespace?Test {public?class?Class1{}???? }在 C# 10 中,我們可以使用一行代碼來聲明 namespace,聲明類型所在的命名空間
namespace?Test; public?class?Class1 { }這樣就沒有那么多的縮進了,代碼看起來更加簡單一些,而且對于我來說寫一些小示例,拷貝起來更方便了,因為一般文章中不會去寫代碼的所有內容,拷貝了之后再縮進有時候可能會出現格式的問題,使用這個特性之后就沒有那么多的縮進了,有些情況下就可以直接復制粘貼了
File-scoped namespace 使用起來就是這么簡單,但也是有限制的
一個文件中只能聲明一個 namespace,如果一個文件中想要有兩個命名空間不能使用 file-scoped namespace
不能和之前命名空間用法一起使用
從以往的項目來看,這兩個限制還是很少會遇到的,絕大多數場景都是可以用的
More
Global usings 能夠讓我們的代碼看起來更加簡潔簡單,全局的類型別名也成為可能,常規的使用還可以,但不要濫用,在代碼里搞出來很多神奇的代碼,可能就會有同事想要罵人了,比如說搞很多 A、B、C 等不明其意的別名,代碼里全是看不懂類型的代碼。。。
還有一個小細節,Global usings 和 Implicit usings 可以結合使用,上面提到的輸出一個 GlobalUsings 的只包含項目文件中定義的 global usings,自己寫在代碼里的不會輸出,和自己在代碼里的 global usings 可以結合使用
對于 File-scoped namespace,推薦一個小技巧,如果你的項目使用了 Editorconfig(如果沒有強烈推薦一下),可以在 editorconfig 中使用 csharp_style_namespace_declarations=file_scoped:suggestion 來配置命名空間的樣式使用 file-scoped namespace,這樣在 VS 中新建類時就會自動使用 file-scoped namespace 這樣的寫法,可以參考這個項目?https://github.com/WeihanLi/SparkTodo
References
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-10.0/globalusingdirective?WT.mc_id=DT-MVP-5004222
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-10.0/file-scoped-namespaces?WT.mc_id=DT-MVP-5004222
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-10.0/lambda-improvements?WT.mc_id=DT-MVP-5004222
https://docs.microsoft.com/en-us/dotnet/core/compatibility/sdk/6.0/implicit-namespaces-rc1?WT.mc_id=DT-MVP-5004222
https://github.com/WeihanLi/SparkTodo
https://github.com/WeihanLi/SamplesInPractice/blob/master/CSharp10Sample/CSharp10Sample.csproj
.NET 6 中的隱式命名空間引用
總結
以上是生活随笔為你收集整理的C# 10 新特性 —— 命名空间的变化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于事件驱动架构构建微服务第12部分:向
- 下一篇: C# 10 新特性 —— CallerA