foreach循环是否仅使用接口IEnumerator
和IEnumerable
来迭代自定义类型(类)的对象,或者也用于迭代内置类型(幕后)?foreach是否为内置类型使用IEnumerator/IEnumerable?
回答
Foreach不依赖于IEnumerable
。但是,如果一个类型实现它,那么foreach循环将能够枚举它(基于模式的匹配)。
在幕后它只需要一个GetEnumerator()
方法和枚举器必须包含Current
和MoveNext()
。
从MSDN:
集合类型:
- 必须是类型之一:接口,类,或结构。
- 必须包含一个名为的GetEnumerator的实例方法,该方法返回一个类型,例如
Enumerator
(将在下面解释)。类型
Enumerator
(一类或结构)必须包含:
- 命名电流返回
ItemType
或可转化为它类型的属性。属性访问器返回集合的当前元素。- 一个布尔方法,命名为MoveNext的,即增加项目计数器,并返回真如果有集合中的多个项目。
从MSDN - Using foreach with Collections
修订:此更新,请参见MSDN页面 - How to: Access a Collection Class with foreach (C# Programming Guide)。
更新的MSDN文档页面(VS 2012代替VS.NET 2003):[如何:使用foreach访问Collection类(C#编程指南)](http ://msdn.microsoft.com/en-us/library/9yb8xew9.aspx) –
foreach对本地和自定义类型都使用IEnumerable。例如,如果查看System.Array,它是所有数组类型的基础,它实现了IEnumerable。
for-each是语言构造,并没有真正区分定制/内置类型。
对于每个不依赖于IEnumerable
,它使用基于模式的匹配。请参阅http://blogs.msdn.com/b/ericlippert/archive/2011/06/30/following-the-pattern.aspx
定义枚举数,不包含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)
{
}
- 1. 使用forEach为内部类的JSP
- 2. 如何检查外部类型是否是内部类型?
- 3. 使用send_file设置内容类型
- 4. 内置类型,何时(不)使用?
- 5. “基本数据类型”和“内置数据类型”的含义是否相同?
- 6. 不能使用匿名类型的foreach
- 7. 使用FileEntity时是否有一般文件内容类型
- 8. 我是否需要使用MultipleIterator的foreach?
- 9. 如何使用Rack为特定文件设置内容类型?
- 10. .Net中是否有内置的URL类?
- 11. 是否有理由在Scala中使用子类型作为类型参数?
- 12. WSGI - 将内容类型设置为JSON
- 13. 是否有可能使用猪内置函数内置java udf
- 14. ASP.NET,确定请求内容类型是否为JSON
- 15. 如何检查ajax响应是否为javascript内容类型?
- 16. GHC-mod是否必须为类型使用全名?
- 17. 返回类型为void的方法是否使用return语句?
- 18. Flow中的子类型内置类型
- 19. 将Activity设置为视图模型类是否合适?
- 20. 是否可以将具有泛型类型的模型配置为属性?
- 21. 内部配置错误,如果内容类型是不是JSON
- 22. 是否可以为HashSet设置泛型?
- 23. Golang检查接口类型是否为
- 24. 如何确定类型是否为RunTimeType?
- 25. 是否为null类型的上下文?
- 26. 将foreach转换为变量类型的思想是什么?
- 27. 将字符类型转换为整数类型是否安全
- 28. 甲骨文内置类型
- 29. python内置函数类型()
- 30. 如何在使用泛型的基类上使用foreach?
的foreach文档:[MSDN - 的foreach,在(C#参考)](http://msdn.microsoft.com/en-us /library/ttw7t8t6%28v=vs.110%29.aspx) –