首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# CollectionBase 類中 List 屬性訪問機制解析

     編輯:程式設計綜合問答

問題代碼

public void Add(Card newCard) { List.Add(newCard); }
public void Remove(Card newCard) { List.Remove(newCard); }

疑問:List 非靜態,為什麼直接用 List.Add 而非 this.List.Add?

核心解釋

List 是 CollectionBase 的受保護實例屬性,返回 IList 類型,封裝了內部 ArrayList。

// CollectionBase 簡化源碼 (參考 MSDN)
public abstract class CollectionBase : IList, ICollection, IEnumerable {
    protected ArrayList InnerList { get; } = new ArrayList();
    
    protected IList List { get { return InnerList; } } // 非靜態實例屬性
    
    // ... 實現 IList 接口方法委託給 InnerList ...
}

為什麼直接寫 List.Add?

  • 在繼承類 Cards 的實例方法中,List 等價於 this.List
  • this 隱式可訪問基類受保護成員
  • List 返回 IList,調用其 Add 方法

MSDN 文檔原文

List 屬性:獲取一個 IList,它包含 CollectionBase 實例中元素的列表。

完整示例

using System.Collections;

public class Card { public string Name; }

public class Cards : CollectionBase {
    public void Add(Card card) { List.Add(card); }       // 等同 this.List.Add(card)
    public void Remove(Card card) { List.Remove(card); }
    public Card this[int index] {
        get { return (Card)List[index]; }
        set { List[index] = value; }
    }
    public void CopyTo(Cards target) {
        for (int i = 0; i < Count; i++) target[i] = this[i];
    }
    public bool Contains(Card card) { return InnerList.Contains(card); }
}

關鍵屬性對比

屬性類型訪問權限用途
InnerListArrayListprotected直接訪問底層 ArrayList
ListIListprotected通過接口訪問,封裝性更好
Countintpublic元素數量
Capacityintpublic內部容量

總結

List 是實例屬性而非靜態屬性。在派生類方法中直接訪問 List 即訪問 this.List,這是 C# 基類成員訪問的基本語法。建議閱讀 MSDN 官方文檔 獲取權威定義。

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