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

C# 以泛型 Queue、Stack 取代非泛型版本:完整遷移指南

     編輯:關於C語言

前言

非泛型 Queue、Stack 使用 object 儲存元素,導致值型別頻繁裝箱/拆箱。本文提供完整遷移範例,展示改用 Queue<T>、Stack<T> 的代碼變更與效能收益。

Queue 遷移對比

非泛型版本:裝箱/拆箱無處不在

public static void UseNonGenericQueue()
{
    Queue numericQueue = new Queue();
    
    numericQueue.Enqueue(1);  // 裝箱 int → object
    numericQueue.Enqueue(2);  // 裝箱
    numericQueue.Enqueue(3);  // 裝箱
    
    Console.WriteLine(numericQueue.Dequeue());  // 拆箱 object → int
    Console.WriteLine(numericQueue.Dequeue());  // 拆箱
    Console.WriteLine(numericQueue.Dequeue().ToString());  // 拆箱
}

泛型版本:零裝箱,型別安全

public static void UseGenericQueue()
{
    Queue<int> numericQueue = new Queue<int>();
    
    numericQueue.Enqueue(1);  // 直接存入 int[],無裝箱
    numericQueue.Enqueue(2);
    numericQueue.Enqueue(3);
    
    Console.WriteLine(numericQueue.Dequeue());  // 直接讀取 int,無拆箱
    Console.WriteLine(numericQueue.Dequeue());
    Console.WriteLine(numericQueue.Dequeue());
}

Stack 遷移對比

非泛型版本

public static void UseNonGenericStack()
{
    Stack numericStack = new Stack();
    
    numericStack.Push(1);   // 裝箱
    numericStack.Push(2);   // 裝箱
    numericStack.Push(3);   // 裝箱
    
    Console.WriteLine(numericStack.Pop().ToString());  // 拆箱
    Console.WriteLine(numericStack.Pop().ToString());  // 拆箱
    Console.WriteLine(numericStack.Pop().ToString());  // 拆箱
}

泛型版本

public static void UseGenericStack()
{
    Stack<int> numericStack = new Stack<int>();
    
    numericStack.Push(1);   // 直接存入 int[]
    numericStack.Push(2);
    numericStack.Push(3);
    
    Console.WriteLine(numericStack.Pop().ToString());  // 直接讀取 int
    Console.WriteLine(numericStack.Pop().ToString());
    Console.WriteLine(numericStack.Pop().ToString());
}

遷移關鍵變更總結

項目非泛型泛型效益
命名空間System.CollectionsSystem.Collections.Generic—
宣告語法new Queue()new Queue<int>()編譯期型別檢查
Enqueue/Push 參數objectT (int)無裝箱
Dequeue/Pop 回傳objectT (int)無拆箱、無轉型
foreach 迭代變數object 需轉型T 直接使用程式碼簡潔

效能量化(百萬次操作基準)

  • 記憶體分配:非泛型產生 ~200 萬個 boxed 物件;泛型零分配
  • GC 壓力:非泛型觸發多次 Gen 0 收集;泛型幾乎無壓力
  • 執行時間:泛型版本通常快 2-5 倍(視操作比例而定)

適用遷移場景

  1. 儲存 int、double、DateTime、Guid 等值型別
  2. 儲存自訂 struct(座標點、向量、金融數據)
  3. 高頻 Push/Pop/Enqueue/Dequeue 操作熱點路徑
  4. 記憶體受限環境(嵌入式、容器化部署)

注意事項

  • 泛型版本無 Clone(),改用 new Queue<T>(source)
  • 泛型版本無同步包裝器,改用 lock 陳述式
  • 若確需儲存異質型別,考慮 Queue<object>(但失去型別安全優勢)

總結

Queue<T>、Stack<T> 是非泛型版本的直接升級替代品:語法幾乎相同、編譯器提供型別安全、執行期消除裝箱/拆箱。只要專案目標框架 ≥ .NET 2.0,無理由繼續使用非泛型版本處理值型別。

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