本文介紹了.net集合類型的接口說明與使用,內容比較簡單,主要是為了理清思路以及明確集合類型作為參數和返回值時的使用規范,關於集合類型的更多討論也可以參看:認識.NET的集合。
NET類庫提供了豐富的集合數據類型,光System.Collections 命名空間就提供了:列表、隊列、位數組、哈希表和字典等多種集合類型。以該命名空間下的集合類型來講,大體可以分為兩類:列表,與字典。前者按照順序訪問集合中的數據,後者提供了鍵值對的訪問方式。
本文主要介紹了列表類型的接口說明和使用上的建議,不涉及.net2.0中的泛型,後者的接口層次與這兒的介紹類似。
接口定義:
IEnumerator
object Current { get; }
bool MoveNext();
void Reset();IEnumerable
IEnumerator GetEnumerator();
ICollection : IEnumerable
int Count { get; }
bool IsSynchronized { get; }
object SyncRoot { get; }
void CopyTo(Array array, int index);
IList : ICollection, IEnumerable
bool IsFixedSize { get; }
bool IsReadOnly { get; }
object this[int index] { get; set; }
int Add(object value);
void Clear();
bool Contains(object value);
int IndexOf(object value);
void Insert(int index, object value);
void Remove(object value);
void RemoveAt(int index);
說明:
IEnumerator 提供了遍歷數據的方法,在需要依次訪問列表中的數據的情況下,使用該接口。
IEnumerable 為foreach操作提供支持,會返回IEnumerator接口對象。
ICollection 提供了條目數量屬性,與拷貝到數組的方法,同時提供了線程同步支持。
IList 提供了添加,查找,刪除,清空的操作,並支持按索引的訪問方式,同時IList具有只讀和固定長度屬性,如果為只讀或固定長度情況下執行新增,刪除等操作會引起異常。
使用:
1 作為參數:
如果需要遍歷列表,但不需要修改的情況下,優先使用ICollection,因為Collection比Enumerable, Enumerator在名稱上更為貼切。同時,Collection提供了Count屬性,在不需要遍歷的情況下,即可獲知列表的條目數量,這在進行一些邏輯判斷時,更為有用。
例如:
bool Foo(ICollection list)
{
if (list == null)
throw new ArgumentException("參數不能為空!", "list");
if (list.Count == 0)
{
return false;
}
foreach(object item in list)
{
... option
}
return true;
}
如果需要對列表數據進行修改,查找等操作,使用IList。
2 作為返回值:
如果希望返回一個只讀的列表,使用ICollection,反之IList。
在多數情況下,返回IList,因為IList具有更寬的接口,調用者獲得一個IList類型的列表後,可以更容易的把該列表再傳遞給需要:ICollection或IList的函數。