C# foreach是否对内置类型使用IEnumerator/IEnumerable?
foreach循环是否仅将接口C# foreach是否对内置类型使用IEnumerator/IEnumerable?,c#,.net,interface,foreach,enumerators,C#,.net,Interface,Foreach,Enumerators,foreach循环是否仅将接口IEnumerator和IEnumerable用于迭代自定义类型(类)的对象或也用于迭代内置类型(幕后)?foreach本身并不依赖于IEnumerable。然而,如果一个类型实现了它,那么foreach循环将能够枚举它(基于模式的匹配) 在幕后,它只需要一个GetEnumerator()方法,并且枚举器必须包含Current和MoveNext() 从MSDN: 集合类型: 必须是以下类型之一:接口、类或结构 必须包含一个名为GetEnumerator的实例方法
IEnumerator
和IEnumerable
用于迭代自定义类型(类)的对象或也用于迭代内置类型(幕后)?foreach本身并不依赖于IEnumerable
。然而,如果一个类型实现了它,那么foreach循环将能够枚举它(基于模式的匹配)
在幕后,它只需要一个GetEnumerator()
方法,并且枚举器必须包含Current
和MoveNext()
从MSDN:
- 集合类型:
- 必须是以下类型之一:接口、类或结构
- 必须包含一个名为GetEnumerator的实例方法,该方法返回一个类型,例如
(解释如下)Enumerator
- 类型
枚举器(类或结构)必须包含:
- 名为Current的属性,返回
或可转换为它的类型。属性访问器返回集合的当前元素ItemType
- 一种bool方法,名为MoveNext,如果集合中有更多项,则递增项计数器并返回true
- 名为Current的属性,返回
已更新:请参阅更新的MSDN页面以了解此-。foreach对本机和自定义类型都使用IEnumerable。例如,如果您查看System.Array,它是所有数组类型的基础,它为每个is语言构造实现IEnumerable.,实际上并不区分自定义/内置类型
对于每个不依赖于
IEnumerable
,它使用基于模式的匹配。请参见定义枚举器,无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);
}
}
foreach文档:更新的MSDN文档页(用于VS 2012而不是VS.NET 2003):
WorkInfo wi = new WorkInfo();
foreach(WorkItem witem in wi)
{
}