非泛型 System.Collections.Stack/Queue 僅存 object,值類型入隊/出隊會發生裝箱/拆箱,且缺乏型別安全。泛型版本在編譯期鎖定元素型別,完全避免此開銷。
var q = new Queue();
q.Enqueue(1); // 裝箱
int i = (int)q.Dequeue(); // 拆箱 + 強制轉型
var q = new Queue<int>();
q.Enqueue(1); // 直接存 int
int i = q.Dequeue(); // 直接取 int,無轉型
| 維度 | 非泛型 | 泛型 |
|---|---|---|
| 型別安全 | 執行期檢查 | 編譯期檢查 |
| 效能 | 值類型裝箱/拆箱 | 零裝箱,直接操作 |
| 程式碼簡潔度 | 需轉型、易出錯 | 無轉型、意圖明確 |
| 開發效率 | 需自寫強型別包裝類 | 一行宣告即完成 |
Queue<int> 可接受 short(隱式轉 int),但拒絕 double(需顯式 (int)d)。這正是編譯期型別檢查的體現。
泛型版移除 Clone、IsSynchronized、SyncRoot、Synchronized。替代方案:
new Queue<int>(existingQueue) 建構子接受 IEnumerable<T> 完成淺拷貝。lock(queue.SyncRoot) 或使用 ConcurrentQueue<T>。var src = new Queue<int>(); src.Enqueue(1); src.Enqueue(2);
var clone = new Queue<int>(src); // 獨立副本
foreach (var i in clone) Console.WriteLine(i); // 僅枚舉,不出隊
全面遷移至 Stack<T>/Queue<T> 是現代 C# 專案的基本功,帶來型別安全、效能提升與維護性改善的三重紅利。