foreach
枚举实现IEnumerable
,IEnumerable<T>
,IEnumerator
,或IEnumerator<T>
(或实际上其类实现一个兼容Current
属性和MoveNext()
方法的对象)的任何对象。对于foreach
的语法是:
foreach (type variable in enumerable) { ... }
type
是新variable
变量的类型。 (如果您已经有一个现有的变量可用,则省略该类型)
循环的主体将针对可枚举中的每个对象执行,并且迭代变量(此处为variable
)将包含每次迭代中的对象。
for
是更通用的,并遵循这个模式:
for (initial-statements; loop-condition; post-iteration-actions) {
body
}
这几乎完全等同于:
initial-statements
while (loop-condition) {
body
post-iteration-actions
}
与数组打交道时,您可能会看到一个for
循环,对例如:
for (int index = 0; index < array.Length; index++) {
Console.WriteLine(array[index]);
}
这是一样的事情:
{
int index = 0;
while (index < array.Length) {
Console.WriteLine(array[index]);
index++;
}
}
(请注意,使用foreach
超过阵列是由编译器优化,以使用类似的基于索引的迭代中,因为这是更快的。所以枚举数组时,这三种方法应该具有同等性能和运行时语义)
更多信息,如果你想让它:
foreach
实际上只是语法糖,并可以很容易地转换成while
循环。
foreach (object x in y) {
Console.WriteLine(x);
}
这实际上意味着:
var enumerator = y.GetEnumerator();
try {
object x; // See footnote 1
while (enumerator.MoveNext()) {
x = enumerator.Current;
Console.WriteLine(x);
}
} finally {
((IDisposable)enumerator).Dispose();
}
除将enumerator
变量没有名称,是不可见的。
这很明显,为什么foreach
存在。无论你今天使用它,否则你将不得不编写这个可怕的详细样板代码。 foreach
照顾你的一切 - 抓取一个枚举器,在每次迭代中测试MoveNext()
,提取枚举器的当前值,并在迭代完成后处置枚举器。
该变量实际上是semantically declared inside of the loop, starting with C# 5。这个例子对于C#4和前辈是准确的。
for:http://msdn.microsoft.com/en-us/library/ch45axte.aspx foreach:http://msdn.microsoft.com/en-us/library/ttw7t8t6.aspx – Spontifixus
很多东西是不同的;他们可能会被用来做类似的事情,但可能有很多不同点,因为有相似之处。只要查看每个人所做的事情的定义即可。 – Servy
什么是“C#asp.net?”我不熟悉任何这样的语言。 – cdhowie