C# 使用指令和 .NET 8 型別别名
C#中的using關鍵字不僅僅做一件事,且其基本形式與新功能之間的差距比大多數開發者想像的要大。名稱空間快捷方式自始至今一直存在,.NET 6引入了靜態類別導入,.NET 8更擴展了別名字彙以涵蓋任何類型,包括元組。 了解這三種形式可以讓您將重複的類型聲明減少為文件頂部的單一可讀名稱。
本指南基於Tim Corey對最新功能的演示,在.NET 8主控台應用程式中探討using指令的每種形式。 我們將從熟悉的名稱空間快捷方式入手,逐步進行到新的類型別名語法。
起點:基本名稱空間指令
[0:35 - 1:35] 設置開始時,通過關閉隱式使用來確保每個指令在代碼中清晰可見。 在頂部沒有任何System.Console.WriteLine。 添加一個指令即可解決這個問題:
using System;
using System;
這一行使得System內的每個類型都可以用簡短名稱訪問。 該指令不是從庫中進行導入; 不會引入新的代碼。 它是一個名稱空間快捷方式,用於告訴編譯器在遇到未限定的類型名稱時應檢查的位置。
使用靜態:跳過類別名稱
[2:19 - 2:45] using static形式針對的是特定的静態類,而不是名稱空間。 指向System.Console後,該類別的每個靜態成員都可在無類別前綴的情況下使用:
using static System.Console;
WriteLine("Hello, world!");
using static System.Console;
WriteLine("Hello, world!");
而不是WriteLine。 此形式在.NET 6中引入,當一個文件需要多次調用相同的靜態類時最為有用。 消除重複的類名可在每個調用點上減少視覺雜訊。
類型別名:為任何類型命名
[3:41 - 6:40] .NET 8擴展了別名字彙,使得using可以為任何類型指定一個簡短的名字。 其中一個動機是命名元組。 當一個方法需要在不進行完整類定義的情況下返回多個相關值時,元組通常作為返回類型用途廣泛,但在文件中多次宣告同一元組類型會產生大量重複。
// Without an alias, each declaration repeats the full tuple type
(string FirstName, string LastName) GetUser() { ... }
(string FirstName, string LastName) person = GetUser();
// Without an alias, each declaration repeats the full tuple type
(string FirstName, string LastName) GetUser() { ... }
(string FirstName, string LastName) person = GetUser();
類型別名可將其簡化為頂部的一次聲明:
using Person = (string FirstName, string LastName);
using Person = (string FirstName, string LastName);
從那時起,在文件中Person就代表完整的元組定義:
Person GetUser() { ... }
Person person = GetUser();
Person GetUser() { ... }
Person person = GetUser();
該別名僅存在於其聲明的文件內。 它不會跨應用程序傳播。 請注意,如果您需要讓該類型在整個專案中都可用,則應選擇記錄或類別。
別名與記錄或類別
[5:32 - 6:23] 常見的問題是:如果Person像一個記錄,為什麼不直接聲明一個呢? 答案涉及到範圍和權重。 記錄或類別是一個涵蓋整個專案的命名類型,擁有其自身的文件,並需要隨著代碼庫的發展而進行維護。 元組別名是一種文件本地的便捷設計。 當您在一個類文件中使用一次或兩次兩字段的元組時,創建完整的類型定義增加了的維護負擔是別名所避免的。 .NET團隊的目的是提供一個選擇的梯度,而不是強制在原始元組和完整類別之間進行二元選擇。
結論
三種using形式應對不同的需求。 基本的名稱空間指令縮短整個文件中的類型名稱,而using static則從靜態成員呼叫中移除類別前綴。 .NET 8的類型別名為任何類型(包括元組)給予了一個易讀的名稱,僅限於單個文件的範疇。每種形式在不改變您的代碼的基本行為的情況下減少了重複。
觀看Tim Corey YouTube視頻的完整關於我在Tim Corey頻道上所有三種類型的現場演示,在一個工作的.NET 8專案中。
