C# 允許在類別內部定義另一個類別,稱為**巢狀類型** 或**內部類別**。這不僅是語法糖,更是強大的封裝與命名空間管理工具。本文介紹三種定義形式、外部存取內部的可見性規則,以及為何要使用巢狀類型。
public class Person
{
public class Address // 巢狀類別
{
public string City { get; set; }
public string ZipCode { get; set; }
}
}
public void Process()
{
class LocalHelper // 僅在方法內可見
{
public void DoWork() => Console.WriteLine("Working");
}
new LocalHelper().DoWork();
}
區域類別可捕獲方法區域變數 (類似 Lambda 閉包),但**不可有存取修飾詞**,且無法被方法外部參考。
var anon = new { Name = "Alice", Age = 30 }; // 編譯器產生巢狀密封類別
// 僅限方法內使用,屬性唯讀
public class Outer
{
public class PublicInner { }
protected class ProtectedInner { }
internal class InternalInner { }
private class PrivateInner { }
public void Demo()
{
var a = new PublicInner(); // ✅
var b = new ProtectedInner(); // ✅ (同類別內)
var c = new InternalInner(); // ✅
var d = new PrivateInner(); // ✅
}
}
// 外部程式碼
var x = new Outer.PublicInner(); // ✅
// var y = new Outer.PrivateInner(); // ❌ 編譯錯誤:不可存取
**規則**:外部類別內部可存取**所有**巢狀類別 (含 private);外部程式碼僅能存取 **public / protected / internal** (依修飾詞) 的巢狀類別。private 巢狀類別僅供外部類別內部使用,完美隱藏實作細節。
public class BinaryTree
{
private class Node // 完全隱藏
{
public T Value;
public Node Left, Right;
public Node(T val) => Value = val;
}
private Node _root;
public void Insert(T value) { /* ... 操作 Node ... */ }
public bool Contains(T value) { /* ... */ }
}
// 外部完全不知 Node 存在,只能透過 BinaryTree 公共 API 操作
巢狀類型是 C# 封裝工具箱的利器:三種定義形式滿足不同作用域需求,存取修飾詞精準控制可見性,內部類別享有外部私有成員的特權存取。善用 `private class` 隱藏實作細節,用 `public class` 表達領域概念組合,讓程式碼結構更清晰、更安全。