命名空間是 C# 組織程式碼、避免類別名稱衝突的核心機制。繼基礎篇之後,本文深入探討巢狀命名空間、同一命名空間下同名類別的方法區隔,以及命名空間別名的實務應用技巧。
命名空間可多層巢狀,形成層級結構,進一步細化程式碼組織:
namespace Csharp // 最外層
{
class Man { public string name = "name in Man"; }
namespace Counter // 巢狀於 Csharp 內(或獨立同層)
{
class Monkey { public string name = "name in Monkey"; }
namespace Nestedspace // 再巢狂
{
class Man { public string name = "nested name"; }
}
}
}
// 完整限定名稱
Csharp.Man mike = new Csharp.Man();
Csharp.Counter.Monkey wukong = new Csharp.Counter.Monkey();
Csharp.Counter.Nestedspace.Man jakson = new Csharp.Counter.Nestedspace.Man();
// global:: 強制從全域命名空間根部解析,避免同名衝突
Counter.Monkey wukong2 = new global::Csharp.Counter.Monkey();
輸出結果:
Csharp.Man's name is name in Man Counter.Monkey's name is name in Monkey Counter.Nestedspace.Man's name is nested name
巢狀結構不影響類別存取權限,僅提供邏輯分組。編譯器會將巢狀命名空間視為獨立的完整名稱路徑。
若兩個不同命名空間各有一個同名類別(如 Csharp.Man 與 Csharp.Counter.Nestedspace.Man),且皆定義相同方法:
public void ChangeName(string newName) { this.name = newName; }
透過完整限定名稱建立實例後,呼叫方法互不干擾:
mike.ChangeName("劉德華");
jakson.ChangeName("Mike Jachson");
各自修改自身實例的 name 欄位,編譯器依靠類別完整路徑正確繫結方法,無任何衝突。
使用 using 別名 = 完整命名空間路徑; 語法:
using NewName = Csharp.Csharp; // 為巢狀路徑建立簡短別名
// 使用別名實例化
NewName.Man newMan = new NewName.Man();
newMan.ChangeName("郭靖");
using EF = System.Data.Entity;using MyList = MyProject.Collections.Generic.List;
using SysList = System.Collections.Generic.List;
using StringDict = Dictionary<string, string>;Company.Project.Module 規範命名空間using 別名解決第三方庫類別名衝突,而非在代碼處處寫完整路徑掌握命名空間進階用法,能有效管理大型專案程式碼結構,提升可讀性與維護性。