2013-12-12 57 views
2

我想了解在C#中的IEnumerable接口。正如MSDN中所述
IEnumerable公開了枚舉器,它支持對非泛型集合的簡單迭代。這很簡單。當我們有一個實現這個接口的集合時,我們得到一個枚舉器,它實現了接口IEnumeratorhttp://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>

我的問題是我們每次定義一個數組,因爲數組是一個實現IEnumerableIEnumerator的對象,相應的方法是由編譯器實現的嗎?

在此先感謝您的幫助!

+2

它們已經被實現了(因爲'Array'實現了'IEnumerable',就像你自己注意到的那樣),'foreach'只是實際調用枚舉器方法的語法糖,參見http://stackoverflow.com/questions/5816776/ in-c-is-foreach-purely-a-syntactic-sugar-or-is-there-anything-deeper-about –

+1

關於這個話題的好書[這裏](http://csharpindepth.com/articles/chapter6/ iteratorblockimplementation.aspx) – JMK

+2

它們實際上是由CLI在運行時添加的,請參閱此處的「重要」註釋:http://msdn.microsoft.com/en-us/library/system.array.aspx – Baldrick

回答

2

你的問題,

我的問題是,每次我們定義一個數組,因爲數組是實現IEnumerableIEnumerator,相應的方法是由編譯器實現的對象時?

作爲每MSDN documentation備註部可以清楚地提到,

與.NET Framework 2.0開始,Array類實現System.Collections.Generic.IList<T>System.Collections.Generic.ICollection<T>,和System.Collections.Generic.IEnumerable<T>通用接口。 實現在運行時提供給陣列,因此對文檔構建工具不可見。因此,泛型接口不會出現在Array類的聲明語法中,並且只有通過將數組轉換爲通用接口類型(顯式接口實現)才能訪問的接口成員沒有參考主題。將數組轉換爲這些接口之一時要注意的關鍵是要添加,插入或移除元素的成員拋出NotSupportedException

是的,編譯器在運行時將實現提供給數組。

編輯你在評論

問題,與所有的非泛型集合會怎麼樣?

讀帖,

,看着所有的Collections後之後,我發現ArrayListBitArray等都是集合,但不實現任何通用接口。

糾正我,如果我在這個錯了我不這麼認爲所有Collection的實現將在運行時提供。

+0

所有非泛型集合都會發生這種情況嗎? – Christos

+0

@ChristosPaisios我無法理解你真正的意思是什麼'所有非泛型集合發生'你問或評論 – dbw

+0

是的,我問。 – Christos

相關問題