(譯註:雖然程式碼較多,但程式設計師一眼即可看出是三維陣列迴圈;而 foreach 卻無人能一眼看出在做什麼!這當然可視為優點。)
事實上,foreach 也能在每維下限不同的多維陣列(鋸齒陣列)上運作。我不想寫這樣的程式碼甚至不想作範例,但當有人寫出這樣的集合時,foreach 能勝任。
foreach 提供極大伸縮性:當發現需修改陣列底層資料結構時,能盡可能保證程式碼無需修改。從簡單陣列開始:
int[] foo = new int[100];
稍後發現缺乏 Array 類別功能,需改為 ArrayList:
ArrayList foo = new ArrayList(100);
所有 for 迴圈程式碼損壞(Length 改為 Count,索引器回傳 object 需轉型),但 foreach 根據操作物件自動編譯成適當轉型程式碼,完全無需修改。不僅標準陣列,任何集合型別同樣適用。
若集合支援 .NET 規則,使用者即可用 foreach 迭代。類別擁有下列任一特徵即視為集合:
GetEnumerator() 方法。IEnumerable 介面。IEnumerator 介面。IEnumerable 包含 GetEnumerator()。foreach 產生優化後的程式碼:
IEnumerator it = foo.GetEnumerator() as IEnumerator;
using (IDisposable disp = it as IDisposable)
{
while (it.MoveNext())
{
int elem = (int)it.Current;
sum += elem;
}
}
若列舉器實作 IDisposable,編譯器自動優化為 finally 區塊。無論如何,foreach 產生正確程式碼。
foreach 廣泛應用:正確處理陣列上下界、迭代多維陣列、強制轉型為適當型別(使用最有效結構)、產生最有效迴圈結構。這是迭代集合最高效方法,程式碼更持久(不因錯誤大幅修改),初次撰寫更簡潔,長期累積生產力提升。