global 是 C# 2.0 引入的上下文關鍵字,專門用於「全域命名空間別名限定詞」(global namespace alias qualifier)。雖然良好的命名習慣能避免 99% 的衝突,但在引用第三方庫、遷移舊代碼或生成代碼時,難免遇到「自訂類型名稱與 .NET 基礎類庫類型同名」的情境——此時 global:: 就是唯一乾淨的解法。
// 專案中有人(或第三方庫)定義了名為 System 的類別
public class System { }
// 你想用 .NET 的 Console.WriteLine
System.Console.WriteLine("Hello"); // 編譯錯誤:找不到 Console,因為綁定到上面的 System 類別
global::System.Console.WriteLine("Hello"); // 強制從全域命名空間解析 System
global::System.Collections.Generic.List<int> list = new(); // 同理
using System;
namespace GlobalKeywordDemo
{
// 故意定義同名類別模擬衝突
public class System { }
class Program
{
static void Main()
{
// 錯誤示範:編譯器綁定到本地 System 類別
// System.Console.WriteLine("Error"); // CS0117: 'System' does not contain a definition for 'Console'
// 正確:global:: 強制跳到全域命名空間
global::System.Console.WriteLine("Resolved via global::System");
global::System.Console.ReadKey();
}
}
}
現代 C# 允許在專案層級(通常在 GlobalUsings.cs 或 <GlobalUsings> 專案屬性)宣告全域 using,減少每個檔案的重複引用:
// GlobalUsings.cs
global using System;
global using System.Collections.Generic;
global using System.Linq;
global using Microsoft.Extensions.Logging;
這與 global:: 限定詞不同:前者是「專案層級自動匯入」,後者是「型別名稱解析時強制從根命名空間開始」。兩者可同時存在,互不干擾。
// 別名:給衝突的命名空間取短名
using Sys = global::System;
using MySys = MyCompany.System;
Sys.Console.WriteLine("via alias");
MySys.DoSomething();
別名適合「同專案內頻繁使用多個同名空間」;global:: 適合「偶爾需要繞過區域同名類型」的精確修正。
System、Collections、Linq 等 BCL 核心命名空間名稱;啟用代碼分析規則 CA1724(型別名稱不應與命名空間衝突)。global:: 前綴,避免使用者專案的同名類型干擾。global:: 修正編譯錯誤,再逐步重構命名。global 是存取修飾詞:它不是 public/internal,不影響存取層級。global:: 能解決組件衝突:它只解決「編譯時期命名空間解析」,若兩個組件定義相同完整型別名稱(含命名空間),仍需用 extern alias 區分組件。global:: 是 C# 命名空間解析機制的「安全閥」,平時鮮用,但關鍵時刻能救場。養成「生成代碼加 global::、業務代碼避免衝突命名」的習慣,即能從根源杜絕此類問題。