首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 巢狀類型入門 (一):定義形式、存取規則與命名空間管理

     編輯:關於C語言

前言

C# 允許在類別內部定義另一個類別,稱為**巢狀類型** 或**內部類別**。這不僅是語法糖,更是強大的封裝與命名空間管理工具。本文介紹三種定義形式、外部存取內部的可見性規則,以及為何要使用巢狀類型。

一、三種定義形式

1. 類別內直接定義 (最常見)

public class Person
{
    public class Address // 巢狀類別
    {
        public string City { get; set; }
        public string ZipCode { get; set; }
    }
}

2. 方法內定義 (區域類別)

public void Process()
{
    class LocalHelper // 僅在方法內可見
    {
        public void DoWork() => Console.WriteLine("Working");
    }
    new LocalHelper().DoWork();
}

區域類別可捕獲方法區域變數 (類似 Lambda 閉包),但**不可有存取修飾詞**,且無法被方法外部參考。

3. 匿名類別 (隱式巢狀)

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 巢狀類別僅供外部類別內部使用,完美隱藏實作細節。

三、為什麼使用巢狀類型?三大優勢

  1. 封裝實作細節:將輔助類別 (Node、Iterator、State) 設為 `private`,外部完全不可見,防止濫用。
  2. 邏輯分組與命名空間管理:`Person.Address`、`Order.Detail`、`TreeNode.Child` 等語意清晰,避免全域命名空間汙染。
  3. 存取外部私有成員:內部類別可自由讀寫外部類別的 `private` 欄位/方法,**無需屬性暴露**,極適合「外部類別的擴充行為」實作。

四、靜態 vs 非靜態巢狀類別

  • **預設為非靜態** (C# 無 `static class` 修飾詞於巢狀類別),但**不持有外部實例參考** (不同於 Java 內部類別)。
  • 若需存取外部實例成員,必須**顯式傳遞外部實例** 或在外部實例方法中建立內部實例。
  • 可宣告 `static` 修飾詞 (C# 7.0+),明確表示不依賴外部實例,編譯器會強制檢查。

五、簡單範例:二元樹節點封裝

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` 表達領域概念組合,讓程式碼結構更清晰、更安全。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved