表4-1中的幾個ArrayList的成員和泛型List的成員並非一一對應。從屬性開始說,只有Capacity,Count和Item屬性兩個類中都存在。為了彌補List類中的幾個缺失的屬性,可以把它顯式轉換為Ilist接口。下面的代碼演示了如何使用這些顯式轉換以獲得缺失的屬性。
List<int> numbers = new List<int>();
Console.WriteLine(((IList)numbers).IsReadOnly);
Console.WriteLine(((IList)numbers).IsFixedSize);
Console.WriteLine(((IList)numbers).IsSynchronized);
Console.WriteLine(((IList)numbers).SyncRoot);
注意,由於缺少返回同步版本的泛型List代碼和缺少返回固定尺寸的泛型List代碼,IsFixedSize和IsSynchronized屬性將總是返回false。SyncRoot屬性被調用時將總是返回相同的對象,本質上這個屬性返回this指針。微軟已經決定從所有泛型集合類中去除創建同步成員的功能。做為代替,他們推薦使用lock關鍵字去鎖住整個集合或其他類型的同步對象來滿足您的需要。
靜態的ArrayList.Repeat在泛型List中沒有對應的方法。做為代替,您可以使用下面的泛型方法:
public static void Repeat<T>(List<T> list, T obj, int count)
{
if (count < 0)
{
throw (new ArgumentException(
"參數count 必須大於或等於零"));
}
for (int index = 0; index < count; index++)
{
list.Add(obj);
}
}
這個泛型方法有三個參數:
list
泛型List對象
obj
將被以指定次數添加進泛型List中的對象
count
把obj添加進泛型類中的次數
因為Clone方法也沒有出現在泛型List類中(因為這個類並沒有實現Icloneable接口),您可以使用泛型List類的GetRange方法做為替代。
List<int> oldList = new List<int>();
// 給oldList添加元素…
List<int> newList = oldList.GetRange(0, oldList.Count);
GetRange方法對List對象中一個范圍的元素執行淺拷貝(跟ArrayList中的Clone方法接近)。在此例中這個范圍是所有元素。
提示:ArrayList默認的初始容量是16個元素,而List<T>的默認初始容量為4個元素。這意味著當添加第17個元素時,List<T>不得不改變尺寸(重新分配內存)3次,而ArrayList只重新分配一次。這一點在評估應用程序性能時需要被考慮。