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

C# 泛型集合介面全景圖:IEnumerable、ICollection、IList、IDictionary

     編輯:關於C#

為何只關注泛型介面?

非泛型介面(IEnumerable、ICollection…)已標記過時,泛型版提供型別安全、效能(值類型免裝箱)、語意清晰。C++ 開發者注意:C# 泛型在執行期實例化,JIT 共享程式碼,避免 C++ 模板的程式碼膨脹。

核心介面速覽

介面用途關鍵成員
IEnumerable<T>支援 foreach 迭代GetEnumerator()
IEnumerator<T>迭代器本體Current、MoveNext()、Reset()
ICollection<T>集合基礎契約Count、Add/Remove/Clear、CopyTo、IsReadOnly
IList<T>索引存取、有序集合this[int]、Insert/RemoveAt、IndexOf
IDictionary<TKey,TValue>鍵值對集合this[TKey]、Keys/Values、ContainsKey
IComparer<T>外部比較器Compare(T,T)
IComparable<T>內建比較CompareTo(T)

9.4.1 實作 IEnumerable<T>:讓自訂類別支援 foreach

關鍵:yield return

public class ListBoxTest : IEnumerable<string> {
    private string[] _items = new string[8];
    private int _count = 0;

    public IEnumerator<string> GetEnumerator() {
        for (int i = 0; i < _count; i++)
            yield return _items[i]; // 編譯器自動產生狀態機
    }

    // 非泛型 IEnumerable 顯式實作(介面繼承關係要求)
    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();

    public void Add(string s) => _items[_count++] = s;
    public string this[int i] { get => _items[i]; set => _items[i] = value; }
}

yield return 原理

  • 編譯器產生實作 IEnumerator<T> 的巢狀類別,封裝狀態(索引、this 指標)。
  • 每次 MoveNext 執行到下一個 yield return 即暫停,下次繼續。
  • 記憶體效率高:不需一次建立整個集合快照。

使用範例

var lb = new ListBoxTest("Hello", "World");
lb.Add("Who"); lb.Add("Is"); lb.Add("John"); lb.Add("Galt");
lb[1] = "Universe";

foreach (var s in lb) Console.WriteLine($"Value: {s}");
// Value: Hello
// Value: Universe
// Value: Who
// Value: Is
// Value: John
// Value: Galt
// Value: 
// Value: 

介面繼承關係圖

IEnumerable<T> → IEnumerable
    ↑
ICollection<T> → ICollection
    ↑
IList<T> → IList
    ↑
IDictionary<TKey,TValue> → IDictionary

實作 IList<T> 即自動滿足所有上層介面契約。

最佳實務

  • 公開 API 傳回型別盡量用介面(IEnumerable<T>、IReadOnlyList<T>),保留變更實作彈性。
  • 唯讀集合回傳 IReadOnlyCollection<T> / IReadOnlyList<T>(.NET 4.5+)。
  • 需自訂迭代邏輯時優先用 yield return,手寫 IEnumerator 易出錯且冗長。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved