跳至頁尾內容
Iron Academy Logo
學習C#
學習C#

其他類別

C# 10 和 .NET 6 中的全域使用,十分鐘內了解

[[academy-video-youtube({"vid": "RWYrafpP53A", "start_time": "0", "title": "在10分鐘內了解C# 10和.NET 6中的全域使用", "creator": "Tim Corey", "length": "5m 33s"})]]

任何翻閱過C#文件頂部的人都會熟悉這個習慣:在每個類宣告上方堆疊的一列using語句,從一個文件到下一個文件不斷重複。 一個典型的專案會反覆使用相同的命名空間,而當需要更改時編輯全部它們是一個無實際收益的苦差事。 C# 10新增了全域using指令來移除專案範圍內的重複。

在他的影片"在10分鐘內了解C# 10和.NET 6中的全域使用"中,Tim Corey介紹了全域using的作用,將它們放置在哪裡以便團隊找到,以及可以讓您在成員呼叫中省略類前綴的靜態變體。 他還指出一個值得注意的設計陷阱:全域引入一個命名空間會讓整個專案暴露在其內部的任何名稱中。 那些將相同的五個using行拷貝到每個新類別中的人會在這裡發現清理模式。

重複問題

[0:17 - 1:50] Tim從一個新的.NET 6主控台應用程式開始,並建立了一個包含PersonModel類別的Data資料夾。 從Program.cs引用該類別需要在文件頂部加上預期的PersonModel的類別意味著也需要在該文件頂部新增相同的using行。 有半打類別時,相同的導入被寫了六次。

這正是global using所設計的情況。 任何整個專案依賴的命名空間、型別或靜態類別只需宣告一次,即可在每個文件中使用,而不需要每個文件重複聲明。

將Using升級為全域範疇

[1:50 - 2:24] 語法是在現有指令前面加上一個關鍵字:

global using GlobalUsings.Data;
global using GlobalUsings.Data;

這一行放置於專案的任何.cs文件中,使GlobalUsings.Data在該專案的每個文件中都可用。 之前需要自己使用行的其他類別不再需要它; 型別會自動解析。 範圍停止於專案邊界,因此從兄弟專案引用類別仍需正常的專案引用加上自己的全域或每文件使用。

這不會隱藏型別來源。 編譯器仍將PersonModel解析到其命名空間; 命名空間只是預先匯入了。 運行時行為與在每個文件頂部寫出相同的using完全相同。

集中使用一個文件

[2:24 - 3:32] 將全域using指令散布在隨機文件中在技術上是有效的,但操作上則顯得凌亂。 如果一個新團隊成員看到PersonModel解析而沒有明顯的匯入,他們需要grep專案以查找它在哪被設為全域。 不斷演變的慣例是將所有全域使用保存在專案根目錄的一個文件中,命名為Usings.cs或GlobalUsings.cs等可預測的名稱:

// Usings.cs at the project root
global using GlobalUsings.Data;
global using System.Text.Json;
global using System.Collections.Concurrent;
// Usings.cs at the project root
global using GlobalUsings.Data;
global using System.Text.Json;
global using System.Collections.Concurrent;

該文件不包含其他內容。 任何加入專案的人都知道確切地會去哪一個地方查看全域可用的內容。 這與近來C#版本引入的基於文件的命名空間和其他簡化開場白的功能相輔相成,全都旨在使專案樣板更容易快速閱讀。

全域Using靜態用於方法匯入

[3:32 - 4:50] 全域using指令可與先前新增的using靜態形式組合。 組合使您可以在整個專案中刪除靜態類別成員中的類前綴。 Tim顯示的動機案例是Console.WriteLine

global using static System.Console;
global using static System.Console;

在集中使用文件中加入這一行,WriteLine("hello")。 這種模式適用於數學助手(全域使用靜態System.Math讓您可以不使用前綴來寫Sqrt(x))以及任何其他您程式碼庫依賴的靜態類別。

這是Tim最謹慎使用的形式。 當方法明顯時,刪除類別前綴是一種可讀性提升,但當兩個靜態類別暴露出同名方法時,它可能成為混亂的來源。 查看赤裸的WriteLine呼叫的讀者需要信任集中文件,而不在上下文中看到源頭。

當全域引入互相衝突時

[4:50 - 5:14] 命名空間的整個重點是防止具有相同短名稱的型別發生碰撞。 全域引入命名空間一次性移除掉了整個專案的緩衝區。 如果您的System.Data,那麼每個文件現在都必須加以區分。 成本並不在衝突發生的地方出現,而是在每一個未來遭遇該衝突的文件。

Tim的建議是有意識地使用全域使用,偏好您知道專案普遍依賴的命名空間,並特別小心全域使用靜態。 一個合理的起始集合是每個文件無論如何都匯入的命名空間; 超過該範圍的擴展需要進行程式碼審查。

總結:更少的形式,更相同的行為

[5:14 - 5:33] 全域使用是一個小功能,但在專案的整個生命週期中有很大回報。 每一個不再攜帶冗餘進口線的文件都是一個開啟至實際程式碼更快的文件,而對共享命名空間的編輯只在一個地方發生,而不是十幾個地方。 同樣的用心僅供型別別名和更廣泛的using家族使用:在可讀性提升明顯的地方使用它,並保持中心文件足夠小,以便下個開發者能夠一眼掃過。

結論

[5:14 - 5:33] 全域使用以專案範圍指令替代每文件使用行,全域使用靜態變體從靜態成員呼叫中移除類前綴,而專案根目錄的一個單一Usings.cs文件是保持可發現性的慣例。 該功能是選擇加入和附加的,因此在現有程式碼庫上採用是增量的。

範例提示:當您在您的.csproj中透過System.Collections.Generic),而不需要您撰寫它們。 將其與您的Usings.cs文件搭配,用於專案特定的進口,每個文件的頂部會明顯變短。

在他的YouTube頻道觀看完整影片,在10分鐘的訓練系列中獲得更多現代C#專案結構的見解。

Hero Worlddot related to C# 10 和 .NET 6 中的全域使用,十分鐘內了解
Hero Affiliate related to C# 10 和 .NET 6 中的全域使用,十分鐘內了解

分享您所愛以賺取更多報酬

您是否為使用 .NET、C#、Java、Python 或 Node.js 的開發者建立內容?將您的專業知識轉化為額外收入!

Iron 支援團隊

我們線上24小時,每週5天。
聊天
電子郵件
給我打電話