首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

C# 高品質程式碼建議 20:用泛型集合取代非泛型集合

     編輯:關於SqlServer

為什麼要拒絕 ArrayList?

ArrayList 屬第一代集合,元素型別為 object,導致三大問題:

  1. 裝箱/拆箱:值型別(int等)加入時裝箱,取出時拆箱
  2. 強制轉型:foreach (int item in al) 隱含 (int) 轉型
  3. 非型別安全:編譯期不檢查,執行期才拋 InvalidCastException

實證效能差距

// 非泛型
ArrayList al = new ArrayList();
al.Add(1); // 裝箱
int t = (int)al[0]; // 拆箱+轉型

// 泛型
List list = new List();
list.Add(1); // 無裝箱
int t = list[0]; // 無拆箱、無轉型

百萬筆測試結果

集合類型耗時(ms)GC 次數(Gen 0)
ArrayList237526
List<int>2205

泛型快 10 倍,GC 壓力降 80%。

原始碼層面的差異

ArrayList.InsertRange 內部:建立 object[] → CopyTo → 再 CopyTo 到內部陣列,全程裝箱/拆箱。

List<T> 直接操作 T[],零額外分配。

命名空間對照

  • 非泛型:System.Collections (ArrayList, Hashtable, Queue, Stack)
  • 泛型:System.Collections.Generic (List<T>, Dictionary<TKey,TValue>, Queue<T>, Stack<T>)

型別安全實證

List list = new List();
list.Add(1);
list.Add(2);
// list.Add("mike"); // 編譯錯誤:無法從 string 轉換為 int

何時仍可用非泛型?

  • 需儲存真正異構物件(極少見)
  • 相容 .NET 1.1 老舊專案
  • 反射/動態情境下型別未知

最佳實踐

預設用泛型集合。只有在明確需要異構儲存時,才考慮非泛型或 List<object>。

本系列持續更新至建議 157,歡迎持續關注。

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