3

foreach 循环是否使用接口IEnumerator并且IEnumerable仅用于迭代自定义类型(类)的对象或也用于迭代内置类型(在幕后)?

4

4 回答 4

7

Foreach 并不依赖于此IEnumerable。但是,如果一个类型实现了它,那么 foreach 循环将能够枚举它(基于模式的匹配)。

在幕后它只需要一个GetEnumerator()方法,并且枚举器必须包含Currentand MoveNext()

来自 MSDN:

  • 集合类型:

    • 必须是以下类型之一:interfaceclassstruct
    • 必须包括一个名为GetEnumerator的实例方法,该方法返回一个类型,例如Enumerator(如下所述)。
  • 类型Enumerator(类或结构)必须包含:

    • 返回的名为CurrentItemType的属性或可以转换为它的类型。属性访问器返回集合的当前元素。
    • 一个名为MoveNext的bool方法,它增加项目计数器并在集合中有更多项目时返回true 。

来自MSDN - 将 foreach 与集合一起使用

更新:请参阅更新的 MSDN 页面 -如何:使用 foreach 访问集合类(C# 编程指南)

于 2011-09-29T09:13:06.897 回答
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) 
{  
}
于 2011-09-29T09:22:23.833 回答
0

foreach 将 IEnumerable 用于本机和自定义类型。例如,如果您查看 System.Array,它是所有数组类型的基础,它实现了 IEnumerable。

于 2011-09-29T09:13:47.817 回答
0

for-each 是语言结构,并没有真正区分自定义/内置类型。

对于 each 不依赖于IEnumerable,它使用基于模式的匹配。请参阅http://blogs.msdn.com/b/ericlippert/archive/2011/06/30/following-the-pattern.aspx

于 2011-09-29T09:13:51.777 回答