foreach 循环是否使用接口IEnumerator
并且IEnumerable
仅用于迭代自定义类型(类)的对象或也用于迭代内置类型(在幕后)?
问问题
1179 次
4 回答
7
Foreach 并不依赖于此IEnumerable
。但是,如果一个类型实现了它,那么 foreach 循环将能够枚举它(基于模式的匹配)。
在幕后它只需要一个GetEnumerator()
方法,并且枚举器必须包含Current
and MoveNext()
。
来自 MSDN:
集合类型:
- 必须是以下类型之一:interface、class或struct。
- 必须包括一个名为GetEnumerator的实例方法,该方法返回一个类型,例如
Enumerator
(如下所述)。类型
Enumerator
(类或结构)必须包含:
- 返回的名为Current
ItemType
的属性或可以转换为它的类型。属性访问器返回集合的当前元素。- 一个名为MoveNext的bool方法,它增加项目计数器并在集合中有更多项目时返回true 。
更新:请参阅更新的 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 回答