2011-09-29 88 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) 
{ 
}