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

C# 以 List<T> 取代 ArrayList:消除裝箱拆箱提升效能

     編輯:關於C語言

前言

ArrayList 內部使用 object[] 儲存元素,導致值型別每次存取皆產生裝箱/拆箱。本文透過對比範例,展示改用 List<T> 如何徹底消除此開銷,並說明遷移的簡單步驟。

問題示範:ArrayList 的裝箱/拆箱

public static void UseNonGenericArrayList()
{
    ArrayList numbers = new ArrayList();
    
    numbers.Add(1);  // 裝箱:int → object
    numbers.Add(2);  // 裝箱:int → object
    
    // 迴圈拆箱:object → int
    foreach (int i in numbers)
    {
        Console.WriteLine(i);  // 每次迭代產生拆箱
    }
    
    numbers.Clear();
}

IL 代碼證據:

// Add(1) 產生
IL_000A: ldc.i4.1
IL_000B: box [mscorlib]System.Int32  // 裝箱指令
IL_0010: callvirt ... ArrayList::Add(object)

// foreach 拆箱
IL_0025: unbox.any [mscorlib]System.Int32  // 拆箱指令

解決方案:List<T> 零裝箱操作

public static void UseGenericList()
{
    List<int> numbers = new List<int>();
    
    numbers.Add(1);  // 直接寫入 int[] 陣列,無裝箱
    numbers.Add(2);  // 直接寫入 int[] 陣列,無裝箱
    
    // 直接讀取 int,無拆箱
    foreach (int i in numbers)
    {
        Console.WriteLine(i);
    }
    
    numbers.Clear();
}

關鍵差異:List<int> 內部陣列為 int[],元素直接儲存整數值,無型別轉換指令。

效能影響量化

操作ArrayListList<int>差異
加入 100 萬整數~1,000 萬次裝箱分配零分配記憶體/GC 壓力大幅降低
遍歷 100 萬整數100 萬次拆箱零拆箱CPU 週期顯著節省
記憶體佔用物件標頭 + 陣列參考緊湊 int[] 陣列約節省 50% 記憶體

遷移步驟

  1. 命名空間:using System.Collections.Generic; 取代 System.Collections
  2. 宣告:List<int> list = new List<int>(); 取代 ArrayList list = new ArrayList();
  3. 移除轉型:刪除所有 (int)、(string) 等強制轉型
  4. 編譯驗證:編譯器會檢查型別正確性

適用場景

  • 高頻數值運算集合(科學計算、金融模型、遊戲座標)
  • 大量結構體儲存(Point、DateTime、自訂 struct)
  • 記憶體敏感環境(嵌入式、高併發服務)
  • 任何使用 ArrayList 儲存值型別的現有代碼

總結

將 ArrayList 替換為 List<T> 是 .NET 應用程式最具投資報酬率的效能優化之一:代碼變更最小、編譯器保證正確性、效能提升顯著。只要集合元素為值型別,無理由繼續使用 ArrayList。

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