foreach循环是否仅使用接口IEnumerator
和IEnumerable
来迭代自定义类型(类)的对象,还是迭代内置类型(在后台)?
答案 0 :(得分:7)
Foreach不依赖于IEnumerable
。但是,如果一个类型实现它,那么foreach循环将能够枚举它(基于模式的匹配)。
在幕后,它只需要GetEnumerator()
方法,而且枚举器必须包含Current
和MoveNext()
。
来自MSDN:
集合类型:
- 必须是以下类型之一:界面,类或结构。
- 必须包含一个名为 GetEnumerator 的实例方法,该方法返回一个类型,例如
Enumerator
(如下所述)。类型
Enumerator
(类或结构)必须包含:
- 名为当前的属性,它返回
ItemType
或可转换为它的类型。属性访问器返回集合的当前元素。- bool 方法,名为 MoveNext ,会增加项目计数器,如果集合中有更多项目,则返回 true 。
来自MSDN - Using foreach with Collections
更新:请参阅更新的MSDN页面 - How to: Access a Collection Class with foreach (C# Programming Guide) 。
答案 1 :(得分: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)
{
}
答案 2 :(得分:0)
foreach对本机和自定义类型使用IEnumerable。例如,如果您查看System.Array(它是所有数组类型的基础),它将实现IEnumerable。
答案 3 :(得分:0)
for-each是语言构造,并没有真正区分自定义/内置类型。
对于每个都不依赖于IEnumerable
,它使用基于模式的匹配。见http://blogs.msdn.com/b/ericlippert/archive/2011/06/30/following-the-pattern.aspx