我想了解在C#中的IEnumerable
接口。正如MSDN中所述
IEnumerable
公開了枚舉器,它支持對非泛型集合的簡單迭代。這很簡單。當我們有一個實現這個接口的集合時,我們得到一個枚舉器,它實現了接口IEnumerator
(http://msdn.microsoft.com/en-us/library/system.collections.ienumerable.getenumerator(v=vs.110).aspx),並且使用這個枚舉器我們可以像下面這樣遍歷集合中的所有元素:瞭解IEnumerable <T> C#
foreach(var item in items)
{
// code goes here
}
在上面的代碼片段中,items
是一個實現IEnumerable
接口的集合。這是可能的,因爲枚舉器有一個名爲Current
的屬性,它具有集合的當前元素和方法MoveNext
(由枚舉器使用)來移動到下一個元素。最後但並非最不重要的是,它有一個名爲Reset
的方法,它將枚舉數設置爲它的初始位置,它位於集合中的第一個元素之前,如MSDN中所述。
讓我們有下面的代碼片斷:
int[] array = new int[10] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
IEnumerable<int> numbers = array;
foreach (var number in numbers)
{
Console.WriteLine(number);
}
在上面的代碼段,我們初始化整數的數組,然後我們定義一個類型的IEnumerable
指向數組。由於numbers
實現IEnumerable
,我們可以使用上面的foreach
來遍歷它的元素。
我認爲當我們定義numbers
然後嘗試迭代它的元素時,幕後編譯器會發出一些代碼。其實我發現Array
執行IEnumerable<T>
。
我的問題是我們每次定義一個數組,因爲數組是一個實現IEnumerable
和IEnumerator
的對象,相應的方法是由編譯器實現的嗎?
在此先感謝您的幫助!
它們已經被實現了(因爲'Array'實現了'IEnumerable',就像你自己注意到的那樣),'foreach'只是實際調用枚舉器方法的語法糖,參見http://stackoverflow.com/questions/5816776/ in-c-is-foreach-purely-a-syntactic-sugar-or-is-there-anything-deeper-about –
關於這個話題的好書[這裏](http://csharpindepth.com/articles/chapter6/ iteratorblockimplementation.aspx) – JMK
它們實際上是由CLI在運行時添加的,請參閱此處的「重要」註釋:http://msdn.microsoft.com/en-us/library/system.array.aspx – Baldrick