IEnumerable 公開枚舉數(shù),,該枚舉數(shù)支持在非泛型集合上進行簡單迭代,。 該接口只定義了一個函數(shù):GetEnumerator,通過該函數(shù)返回一個循環(huán)訪問集合的枚舉數(shù),。 若要支持foreach語義則須實現(xiàn)此接口,。 IEnumerator 是所有非泛型枚舉數(shù)的基接口。 該接口的成員:
關于枚舉數(shù): 1. 最初,,枚舉數(shù)定位在集合中第一個元素前。Reset 方法還會將枚舉數(shù)返回到此位置,。在此位置,,調(diào)用 Current 屬性會引發(fā)異常。因此,,在讀取 Current 的值之前,,必須調(diào)用 MoveNext 方法將枚舉數(shù)向前移動到集合的第一個元素。 2. 如果 MoveNext 越過集合的結尾,,則枚舉數(shù)將被定位在此集合中最后一個元素的后面,,且 MoveNext 返回 false,。當枚舉數(shù)位于此位置時,對 MoveNext 的后續(xù)調(diào)用也返回 false,。如果最后一次調(diào)用 MoveNext 返回 false,,則調(diào)用 Current 會引發(fā)異常。若要再次將 Current 設置為集合的第一個元素,,可以調(diào)用 Reset,,然后再調(diào)用 MoveNext。 3. 只要集合保持不變,,枚舉數(shù)就保持有效,。如果對集合進行了更改(如添加、修改或刪除元素),,則枚舉數(shù)將失效且不可恢復,,并且下一次對 MoveNext 或 Reset 的調(diào)用將引發(fā) InvalidOperationException。如果在 MoveNext 和 Current 之間修改集合,,那么即使枚舉數(shù)已經(jīng)無效,,Current 也將返回它所設置成的元素。 4. 枚舉數(shù)沒有對集合的獨占訪問權,;因此,,枚舉通過集合在本質上不是一個線程安全的過程。即使一個集合已進行同步,,其他線程仍可以修改該集合,,這將導致枚舉數(shù)引發(fā)異常。若要在枚舉過程中保證線程安全,,可以在整個枚舉過程中鎖定集合,,或者捕捉由于其他線程進行的更改而引發(fā)的異常。 C# 語言的 foreach 語句隱藏了枚舉數(shù)的復雜性,。因此,,建議使用 foreach,而不直接操作枚舉數(shù),。
ICollection 接口是 System.Collections 命名空間中類的基接口,。 [ComVisibleAttribute(true)] public interface ICollection : IEnumerable ICollection 接口擴展 IEnumerable; IDictionary 和 IList 則是擴展 ICollection 的更為專用的接口,。IDictionary 實現(xiàn)是鍵/值對的集合,,如 Hashtable 類。IList 實現(xiàn)是值的集合,,其成員可通過索引訪問,,如 ArrayList 類。 某些集合(如 Queue 類和 Stack 類)限制對其元素的訪問,它們直接實現(xiàn) ICollection 接口,。 ICollection 泛型接口是 System.Collections.Generic 命名空間中類的基接口,。 public interface ICollection<T> : IEnumerable<T>, IEnumerable ICollection 接口擴展 IEnumerable; IDictionary 和 IList 是擴展 ICollection 的更專用接口,。IDictionary 實現(xiàn)是鍵/值對的集合,,如 Dictionary 類。IList 實現(xiàn)是值的集合,,并且可以按索引訪問它的成員,,如 List 類。 從上面可以看出Hashtable是非泛型類而Dictionary為泛型類,,正如ArrayList和List類的關系 IList 是 ICollection 接口的子代,并且是所有非泛型列表的基接口,。 IList 實現(xiàn)有三種類別:只讀,、固定大小和可變大小。無法修改只讀 IList,。固定大小的 IList 不允許添加或移除元素,,但允許修改現(xiàn)有元素??勺兇笮〉?IList 允許添加,、移除和修改元素。 IDictionary 接口是鍵/值對的非通用集合的基接口,。 每個元素都是一個存儲在 DictionaryEntry 對象中的鍵/值對,。 每一對都必須有唯一的鍵。實現(xiàn)在是否允許鍵為空引用方面有所不同,。此值可以為空引用,,并且不必是唯一的。IDictionary 接口允許對所包含的鍵和值進行枚舉,,但這并不意味著任何特定的排序順序,。 IDictionary 實現(xiàn)有三種類別:只讀、固定大小,、可變大小,。無法修改只讀 IDictionary 對象。固定大小的 IDictionary 對象不允許添加或移除元素,,但允許修改現(xiàn)有元素,。可變大小的 IDictionary 對象允許添加,、移除和修改元素,。 C# 語言中的 foreach 語句需要集合中每個元素的類型。由于 IDictionary 對象的每個元素都是一個鍵/值對,因此元素類型既不是鍵的類型,,也不是值的類型,。而是 DictionaryEntry 類型。
注意幾個基接口: 枚舉數(shù)的基接口:IEnumerator,,而IEnumerable則是獲取枚舉數(shù)的方法 類的基接口:ICollection 列表的基接口:IList 鍵/值對的基接口:IDictionary 正因為IEnumerable是獲取枚舉數(shù)的方法,,因此類往往是實現(xiàn)IEnumerable接口而不是直接實現(xiàn)IEnumerator接口。 泛型部分與非泛型相比,,如上面對比的ICollection泛型和非泛型所顯現(xiàn)的差別大致相同,,在System.Collections.Generic中,上述的所有集合類中重要的接口都重新實現(xiàn)了一次,。 |
|
來自: 昵稱11848184 > 《C#》