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

C# 3.0 特性探秘 (三):迭代器模式、IEnumerable 介面與 foreach 編譯器擴展

     編輯:關於C語言

迭代器模式動機

統一存取不同內部結構的集合,避免客戶代碼耦合具體實作 (List、Hashtable 等)。

手工實作迭代器模式


interface ICollection { int Count { get; } Iterator GetIterator(); }
interface Iterator { bool MoveNext(); object Current { get; } }

class List : ICollection { /* 陣列儲存 */ public Iterator GetIterator() => new ListIterator(this); }
class ListIterator : Iterator { /* 索引遍歷邏輯 */ }

static void Main()
{
    ICollection list = new List();
    Iterator it = list.GetIterator();
    while (it.MoveNext()) { object current = it.Current; /* ... */ }
}

.NET 內建介面

  • IEnumerable:單一方法 GetEnumerator() 回傳 IEnumerator。
  • IEnumerator:MoveNext()、Current、Reset()。
  • 所有集合實作 IEnumerable,故支援 foreach。

foreach 編譯器擴展


// 原始碼
foreach (object item in list) Console.WriteLine(item);

// 編譯器展開 (簡化)
IEnumerator e = list.GetEnumerator();
try { while (e.MoveNext()) { object item = e.Current; Console.WriteLine(item); } }
finally { (e as IDisposable)?.Dispose(); }

理解此機制有助於正確實作自訂集合與診斷列舉器相關 Bug。

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