2011-09-29 91 views
3

foreach循環是否僅使用接口IEnumeratorIEnumerable來迭代自定義類型(類)的對象,或者也用於迭代內置類型(幕後)?foreach是否爲內置類型使用IEnumerator/IEnumerable?

+0

的foreach文檔:[MSDN - 的foreach,在(C#參考)](http://msdn.microsoft.com/en-us /library/ttw7t8t6%28v=vs.110%29.aspx) –

回答

7

Foreach不依賴於IEnumerable。但是,如果一個類型實現它,那麼foreach循環將能夠枚舉它(基於模式的匹配)。

在幕後它只需要一個GetEnumerator()方法和枚舉器必須包含CurrentMoveNext()

從MSDN:

  • 集合類型:

    • 必須是類型之一:接口,或結構
    • 必須包含一個名爲的GetEnumerator的實例方法,該方法返回一個類型,例如Enumerator(將在下面解釋)。
  • 類型Enumerator(一類或結構)必須包含:

    • 命名電流返回ItemType或可轉化爲它類型的屬性。屬性訪問器返回集合的當前元素。
    • 一個布爾方法,命名爲MoveNext的,即增加項目計數器,並返回如果有集合中的多個項目。

MSDN - Using foreach with Collections

修訂:此更新,請參見MSDN頁面 - How to: Access a Collection Class with foreach (C# Programming Guide)

+0

更新的MSDN文檔頁面(VS 2012代替VS.NET 2003):[如何:使用foreach訪問Collection類(C#編程指南)](http ://msdn.microsoft.com/en-us/library/9yb8xew9.aspx) –

0

foreach對本地和自定義類型都使用IEnumerable。例如,如果查看System.Array,它是所有數組類型的基礎,它實現了IEnumerable。

2

定義枚舉數,不包含IEnumerable聲明。

public class WorkInfoEnumerator 
{ 
    List<WorkItem > wilist= null; 
    int currentIndex = -1; 


    public MyClassEnumerator(List<WorkItem > list) 
    { 
    wilist= list; 
    } 

    public WorkItem Current 
    { 
    get 
    { 
     return wilist[currentIndex]; 
    } 
    } 

    public bool MoveNext() 
    { 
    ++currentIndex; 
    if (currentIndex < wilist.Count) 
     return true; 
    return false; 
    } 
} 


public class WorkInfo 
{ 
    List<WorkItem > mydata = new List<WorkItem >(); 
    public WorkInfoEnumerator GetEnumerator() 
    { 
     return new WorkInfoEnumerator(mydata); 
    } 
} 

某處在碼可以使用:

WorkInfo wi = new WorkInfo(); 
foreach(WorkItem witem in wi) 
{ 
}