程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#泛型學習03--使用相應的泛型版本替換ArrayList

C#泛型學習03--使用相應的泛型版本替換ArrayList

編輯:C#入門知識

一、使用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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved