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