值得再ading了on how foreach
works(不只是這個問題,但普遍關心的問題):它從該表達式的結果一個枚舉(令人驚訝的廣義定義)的in
權,然後對調查員要求bool MoveNext()
直到MoveNext()
回報假。
這也就沒有什麼意義foreach
反覆評估它從枚舉的表達。事實上,.NET會竭盡全力阻止您在枚舉過程中更改序列 - 換句話說,要確保它正在枚舉與它開始的完全相同的事情。嘗試將它添加項目到List<T>
,而你在foreach:
var list = Enumerable.Range(0, 10).ToList();
foreach (var x in list)
{
list.Add(x);
}
「集合被修改;枚舉操作可能不會執行。」
沒有銷售。
而且如果它獲得新的統計員,那就要跳過他們的項目。第一次迭代,抓住第一個項目。第二:抓住一個新的統計員,跳過一個,接下來。第三:抓住一個新的統計員,跳過兩個,跳下一座橋。
這是瘋了。專業人士無法編寫代碼,甚至無法清醒的業餘愛好者。
所以,它只是使用表達式的結果。無論表達式是否在parens之間,或者是否將其結果分配給局部變量都無關緊要。
兩個版本是相同的。
還有可能存在開放式枚舉的可能性 - 在那裏可能會有一個並行線程,排隊從設備驅動程序或其他東西進來的東西,枚舉可能不一定會結束。但是你仍然可以從任一版本的代碼中獲得相同的枚舉器。
不,這將是荒謬的。在每次迭代中獲得新迭代器有什麼意義? –
通過添加一個你正在得到不同執行的地方,因爲你現在正在IEnumerable上進行操作,不管怎樣,在每次迭代中檢查條件,但是如果你需要多次使用該條件可枚舉, IEnumerable回到列表 –
他們完全一樣 –