命名空間是 .NET 類型的邏輯容器,解決名稱衝突、提供可發現性。它不是安全性邊界,也非物理部署單位 (那是組件)。
namespace MyCompany.MyProject
{
public class User { }
public interface IRepository { }
}
// 寫法 1:點號串聯
namespace MyCompany.MyProject.Data
{
public class UserRepository { }
}
// 寫法 2:明確巢狀 (語意更清晰)
namespace MyCompany
{
namespace MyProject
{
namespace Data
{
public class UserRepository { }
}
}
}
編譯後 IL 完全相同,型別完整名稱皆為 MyCompany.MyProject.Data.UserRepository。
using System.Collections.Generic; // 後續可直接寫 List
using System.Linq;
// 型別別名
using MyList = System.Collections.Generic.List;
using Json = Newtonsoft.Json.JsonConvert;
// 命名空間別名
using MyData = MyCompany.MyProject.Data;
using Legacy = OldSystem.V1.DataAccess;
// 使用
var list = new MyList();
var repo = new MyData.UserRepository();
using static System.Math;
using static System.Console;
// 直接使用靜態方法/屬性
WriteLine(Sqrt(PI * Pow(2, 2))); // 無需 Math.Sqrt, Console.WriteLine
// ✅ 正確
using System;
namespace MyApp { class Program { } }
// ❌ 錯誤:CS1529 - using clause must appear before all other elements
namespace MyApp { using System; class Program { } }
namespace N1.N2 { class A { } }
namespace N3
{
class A { } // 定義型別 A
using A = N1.N2.A; // ❌ CS0101: 型別 'A' 已存在
}
// 解決:改用不同別名
namespace N3
{
class A { }
using AliasA = N1.N2.A; // ✅
class B : AliasA { } // 繼承 N1.N2.A
}
namespace N1.N2 { class A { } }
namespace N3
{
using R = N1.N2; // 別名 R 僅在這個 N3 區塊有效
}
namespace N3 // 同名但不同區塊 (或不同檔案)
{
class B : R.A { } // ❌ CS0246: 找不到 'R'
}
// 正確:別名提升至檔案層級 (不在任何 namespace 區塊內)
using R = N1.N2;
namespace N3 { class B : R.A { } } // ✅
namespace N3 { class C : R.A { } } // ✅ 另一區塊也可用
namespace Outer
{
using System; // 僅 Outer 及其子命名空間可見
namespace Inner
{
// 這裡可直接用 List (繼承 Outer 的 using)
class Test { List list; }
}
}
// 外部檔案若要用 Outer 的 using,必須自己引入
// namespace Outer { using System; } 不會自動套用到其他檔案
| 層級 | 慣例 | 範例 |
|---|---|---|
| 公司/組織 | 反轉網域名 | Contoso, Microsoft, MyCompany |
| 專案/產品 | PascalCase | ECommerce, Payroll, BlogEngine |
| 功能領域 | 複數名詞 | Data, Services, Models, UI, Security |
| 完整範例 | Contoso.ECommerce.Data.Repositories |
// 專案結構
Src/
└── Contoso.ECommerce/
├── Data/
│ ├── Repositories/
│ │ └── UserRepository.cs → namespace Contoso.ECommerce.Data.Repositories
│ └── Entities/
│ └── User.cs → namespace Contoso.ECommerce.Data.Entities
└── Services/
└── OrderService.cs → namespace Contoso.ECommerce.Services
// 編譯時指定別名:csc /r:GridV1=Grid.dll /r:GridV2=GridNew.dll
extern alias GridV1;
extern alias GridV2;
using Grid1 = GridV1::MyGrid;
using Grid2 = GridV2::MyGrid;
// 同時使用兩版本
var old = new Grid1.Control();
var @new = new Grid2.Control();
// GlobalUsings.cs (專案層級自動產生或手動建立)
global using System;
global using System.Collections.Generic;
global using System.Linq;
global using System.Threading.Tasks;
// 所有檔案自動可用,無需重複 using
// UserRepository.cs
namespace Contoso.ECommerce.Data.Repositories; // 分號結尾,整個檔案皆在這命名空間
public class UserRepository { } // 無需大括號縮排
// 等同於 namespace Contoso.ECommerce.Data.Repositories { public class UserRepository { } }
using 順序、別名衝突、專案參考是否遺漏namespace MyProject { } 包裹所有檔案命名空間是 .NET 類型組織的骨架。掌握「定義、巢狀、匯入、別名、作用域」五大核心機制,配合現代 C# 語法 (global using, file-scoped namespace, using static),能打造清晰、無衝突、易維護的程式碼結構。記住:命名空間是給開發者看的邏輯分組,組件才是給執行環境看的物理單位。