首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 泛型集合遷移實戰:從 ArrayList 升級到 List<T>

     編輯:關於C#

遷移動機

ArrayList 存 object,值類型頻繁裝箱/拆箱,且無型別安全。List<T> 以強型別陣列為底層,完全消除此問題,是效能與可維護性的雙重升級。

基本用法對比

// 非泛型
var a = new ArrayList(); a.Add(1); a.Add(2); // 裝箱
foreach (int i in a) Console.WriteLine(i);   // 拆箱

// 泛型
var l = new List<int>(); l.Add(1); l.Add(2); // 無裝箱
foreach (int i in l) Console.WriteLine(i);   // 直接讀取

成員對應速查表(節錄)

ArrayListList<T>備註
Capacity / Count / ItemCapacity / Count / Item完全對應
Add / AddRange / ClearAdd / AddRange / Clear完全對應
BinarySearch / Sort / ReverseBinarySearch / Sort / Reverse完全對應
CloneGetRange(0, Count)淺拷貝替代
IsFixedSize / IsReadOnly / IsSynchronized / SyncRoot((IList)list).xxx顯式轉 IList 存取,前兩者永回 false
Repeat自寫 for+Add無對應靜態方法
FixedSize / ReadOnly / SynchronizedAsReadOnly / lock / 無官方移除同步包裝,建議自行 lock

常見遷移陷阱與對策

1. 缺少 Clone → 用 GetRange

var copy = oldList.GetRange(0, oldList.Count); // 淺拷貝所有元素

2. 缺少 Repeat → 用擴充方法

public static void Repeat<T>(this List<T> list, T item, int count) {
    for (int i=0; i<count; i++) list.Add(item);
}

3. 預設容量差異

  • ArrayList 預設 16
  • List<T> 預設 4
  • 大量資料建議建構時指定 new List<T>(estimatedCount) 避免多次擴容。

4. 同步包裝移除

舊碼 ArrayList.Synchronized(list) → 新碼 lock(list) { ... } 或改用 System.Collections.Concurrent 命名空間。

效能實測提示

百萬級整數加入測試:List<int> 比 ArrayList 快 2-3 倍,記憶體佔用降低 50% 以上(無裝箱物件頭)。

結語

將 ArrayList 全面替換為 List<T> 是零風險、高報酬的重構動作,建議納入程式碼審查清單強制執行。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved