使用foreach循环是否需要IEnumerable接口?

16

我想知道,在什么情况下可以使用foreach循环?我是否需要实现IEnumerable接口?


6
这是一个链接至微软官方网站上的内容,其中包含了关于 Google 的第一条搜索结果解释。该内容主要介绍了如何使用 Microsoft Visual Studio 来编写 C# 代码以实现对 Google 搜索引擎进行自动化测试的过程。 - pascal
http://msdn.microsoft.com/en-us/library/9yb8xew9(VS.80).aspx - Dave
12
你可以在星期二和星期四使用它们,在日历月份的第五个周末期间也可以使用。 - Anthony Pegram
1
只要你不滥用它,随时随地都可以使用它,否则当局可能会很不高兴。 - Arcturus
3
foreach(var complaint in new string[]{ "not ", "a ", "real ", "question!" }) Console.Write(complaint);使用此代码可以循环打印出字符串数组中的每一个元素,即依次输出 "not ", "a ", "real ", "question!"。 - user1228
4个回答

39
不需要实现IEnumerable接口就可以使用foreach语句。以下是MSDN上的一句话引用(http://msdn.microsoft.com/en-us/library/9yb8xew9.aspx):
在C#中,一个集合类不一定需要继承IEnumerable和IEnumerator接口才能与foreach兼容。只要该类具有所需的GetEnumerator、MoveNext、Reset和Current成员,就可以使用foreach。省略接口的好处是使您能够将Current的返回类型定义得比Object更具体,从而提供类型安全性。

我喜欢这个说法,因为它正确地指出IEnumerable不是必需的。虽然没有它肯定会让生活更加困难。 - Anthony Pegram
4
真的很有趣,我不知道这个。但我认为这主要是为了支持.NET 1.0中的类型安全。现在确保类型安全的最佳方式是使用IEnumerable的泛型版本。 - Martin Harris
每天学习新东西。 - BoltClock
好观点。我也不知道那个。 - Zafer
foreach语句是一种语法糖吗?也就是说,编译器是否将其编译成使用GetEnumerator().MoveNext()和Current属性的“常规”for语句? - Josh
1
@Josh:是的,它就是语法糖。不,它没有转化为for循环。请参阅语言规范:http://msdn.microsoft.com/en-us/library/aa664754%28VS.71%29.aspx - Anthony Pegram

2
您可以针对任何实现了 IEnumerableIEnumberable<T> 接口的对象进行 foreach 循环。

2

2

问问自己-你真的需要一个循环计数器吗?

我使用的经验法则是确定是否在两个索引容器之间移动数据,其中确实需要索引值来寻址目标,或者更一般地说,“我是否需要为循环中处理的每个项目都设置索引计数”? 在这些情况下,我使用for循环,在几乎所有其他情况下(foreach可以处理容器,正如上面所述,几乎每个容器),原因非常简单,使用foreach然后必须费力地手动维护循环计数器看起来非常愚蠢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接