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

C# 巢狀類型與包含類型詳解:定義、存取權限與實作範例

     編輯:關於.NET

概念釐清

術語定義
巢狀類型類別完整定義在另一個類別內部 (Inner Class)
包含類型一個類別包含另一個類別型別的資料成員 (Composition)

巢狀類型

基本語法


class Container
{
    class Nested          // 預設 private
    {
        Nested() { }
    }
    
    public class PublicNested  // 可設為 public/protected/internal
    {
        PublicNested() { }
    }
}

特性

  • 預設 private,外部類型不可存取
  • 可設定 public、protected、internal、protected internal、private
  • 可存取外部類別的 private/protected 成員 (含繼承者)
  • 完整名稱:Container.Nested
  • 建立實例:var n = new Container.Nested(); (public 時)

存取外部類別實例


public class Container
{
    private string _name = "Outer";
    
    public class Nested
    {
        private Container _parent;
        
        public Nested() { }
        public Nested(Container parent) => _parent = parent;
        
        public void PrintParentName() => Console.WriteLine(_parent._name); // 存取 private
    }
}

包含類型 (Composition)

定義

類別 A 有一個類別 B 型別的私有欄位,A 的實例「包含」B 的實例。

範例


public class Aaa
{
    private string _val1;
    public Aaa(string str) => _val1 = str;
    public string Val1 { get => _val1; set => _val1 = value; }
}

public class Bbb
{
    private Aaa _bval1;  // 包含 Aaa 型別的私有成員
    
    public Aaa Bval1 
    { 
        get => _bval1; 
        set => _bval1 = value; 
    }
}

// 使用
Bbb bb = new Bbb();
bb.Bval1 = new Aaa("abc123");
Console.WriteLine(bb.Bval1.Val1);  // 輸出: abc123

關鍵區別

  • 巢狀:定義在內部,型別隸屬外部類別命名空間
  • 包含:獨立類別,透過欄位組合關係
  • 包含關係中,外部類別無法直接存取內部類別的 private 成員 (除非透過公開介面)

巢狀類型完整範例


public class Container
{
    private string _containerData = "Container Data";
    
    public class Nested
    {
        private Container _parent;
        
        public Nested() { }
        public Nested(Container parent) => _parent = parent;
        
        public void AccessContainerPrivate()
        {
            if (_parent != null)
                Console.WriteLine(_parent._containerData);  // 合法存取 private
        }
    }
    
    public void Demo()
    {
        var nested = new Nested(this);
        nested.AccessContainerPrivate();
    }
}

// 外部使用
Container c = new Container();
c.Demo();  // 輸出: Container Data

// 直接建立巢狀實例 (需 public)
Container.Nested n = new Container.Nested();

使用建議

  1. 巢狀類型:邏輯上緊密相關、不需外部獨立使用、需存取外部私有狀態 (如集合的 Enumerator、節點類別)
  2. 包含類型:一般物件組合關係、領域模型實體關聯、依賴注入
  3. 避免過度巢狀:超過 2 層嵌套影響可讀性

總結

巢狀類型提供封裝與存取外部私有成員的能力,適合實作細節隱藏;包含類型是標準物件組合方式。理解兩者差異,依領域模型需求選擇。

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