C#中的foreache語句不會解析為IL代碼中的foreach語句。C#編譯器把foreach語句轉換為IEnumerable接口的方法和屬性。
下面是一個簡單的foreach語句,它迭代了數組persons中所有元素
foreach(person p in persons)
{
Console.Writeline(p);
}
foreach語句會解析為下面代碼段。首先,調用GetEnumerable()方法,獲得數組的一個枚舉。在while循環中,只要MoveNext()返回為true,用Current屬性訪問數組中的元素:
IEnumerator enumerator = persons.GetEnumerator();
while(enumerator.MoveNext())
{
Person P = (Person) enumerator.Current;
Console.WriteLine(p);
}
C#1.0使用了foreach語句可以輕松實現迭代集合,但創建枚舉器需要做大量工作,C#2.0添加了yield語句,以便創建枚舉器。
yield return 返回集合中的一個元素,並移動到下一個元素上。yield break 可停止迭代。
public class HelloCollection
{
public IEnumerator GetEnumerator()
{
yield return "Hello";
yield return "World";
}
}