一、使用System.Collection.ArrayList對象的簡單例子:
View Code
public static void UseNonGenericArrayList()
{
// 創建一個ArrayList.
ArrayList numbers = new ArrayList();
numbers.Add(1); // 導致裝箱操作
numbers.Add(2); // 導致裝箱操作
// 顯示ArrayList內的所有整數
// 每次迭代都導致拆箱操作
foreach (int i in numbers)
{
Console.WriteLine(i);
}
numbers.Clear();
}
二、使用了System.Collections.Generic.List對象的簡單例子:
View Code
public static void UseGenericList()
{
// 創建一個List.
List<int> numbers = new List<int>();
numbers.Add(1);
numbers.Add(2);
// 顯示List中的所有整數.
foreach (int i in numbers)
{
Console.WriteLine(i);
}
numbers.Clear();
}
因為所有的應用程序幾乎都會使用ArrayList,從提升您的應用程序的執行效率開始是一個不錯的選擇。對於應用程序中簡單使用ArrayList的地方來說,這種替代是非常容易的。但有些地方需要注意,例如,泛型List類未實現Icloneable接口而ArrayList實現了它。
圖1顯示了兩個類中的等價成員
圖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中沒有對應的方法。做為代替,您可以使用下面的泛型方法:
View Code
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只重新分配一次。這一點在評估應用程序性能時需要被考慮。
摘自 chen3jian