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

C# 高品質程式碼建議:泛型集合、正確選擇集合與執行緒安全

     編輯:關於C#

建議 20:優先使用泛型集合取代非泛型集合

優勢

  1. 型別安全:編譯期捕獲型別錯誤,避免執行期 InvalidCastException
  2. 效能優越:避免值型別的裝箱/拆箱,記憶體佔用更少,GC 壓力更小

效能實測(1000 萬次 Add/Index)

集合耗時 (ms)Gen 0 GC 次數
ArrayList~1,850~42
List<int>~1,200~18

List<T> 速度提升 ~35%,GC 次數減少 ~57%。數據量越大差距越明顯。

建議 21:根據場景選擇正確集合

場景推薦集合關鍵特性
固定大小、頻繁索引存取T[] / Array記憶體連續、零額外負擔、最快索引
動態增刪、順序存取List<T>動態擴容、快速尾端新增、索引 O(1)
鍵值對查找、唯一鍵Dictionary<TKey,TValue>O(1) 查找/新增/刪除、雜湊表實作
先進先出 (FIFO)Queue<T>Enqueue/Dequeue O(1)
後進先出 (LIFO)Stack<T>Push/Pop O(1)
唯一值集合、集合運算HashSet<T>O(1) Contains、Union/Intersect/Except
排序鍵值對SortedDictionary<TKey,TValue>紅黑樹、鍵有序、O(log n) 操作
排序唯一值SortedSet<T>紅黑樹、值有序、O(log n)

核心原則:先分析「主要操作是什麼?(索引、查找、增刪、排序、去重)」,再選擇對應時間複雜度最優的集合。

建議 22:確保集合執行緒安全

問題示範

var list = new List<Person> { ... };
var t1 = new Thread(() => {
    foreach (var p in list) { Console.WriteLine(p.Name); Thread.Sleep(1000); }
});
var t2 = new Thread(() => { Thread.Sleep(1000); list.RemoveAt(2); });
t1.Start(); t2.Start();
// 結果:t1 拋出 InvalidOperationException「集合已修改,枚舉操作可能無法執行」

非泛型集合:SyncRoot 模式

var arrayList = new ArrayList { ... };
lock (arrayList.SyncRoot) { foreach (...) { ... } }
lock (arrayList.SyncRoot) { arrayList.RemoveAt(2); }

泛型集合:自訂鎖物件

var list = new List<Person> { ... };
private static readonly object _syncLock = new object();

lock (_syncLock) { foreach (var p in list) { ... } }
lock (_syncLock) { list.RemoveAt(2); }

進階:.NET 4.0+ 並行集合

集合適用場景特性
ConcurrentQueue<T>生產者/消費者佇列無鎖、高併發 Enqueue/TryDequeue
ConcurrentStack<T>無鎖堆疊Push/TryPop
ConcurrentDictionary<TKey,TValue>高併發字典TryAdd/GetOrAdd/AddOrUpdate 原子操作
BlockingCollection<T>有界緩衝、生產消費支援 Take/Add 阻塞、CompleteAdding

選擇指南

  • 簡單同步、低併發、操作需原子性:lock + 一般集合
  • 高併發、大量存取、需無鎖效能:Concurrent* / BlockingCollection
  • 唯讀場景:ImmutableList<T>、ImmutableDictionary<TKey,TValue>(System.Collections.Immutable)

總結

  1. 預設用 List<T>、Dictionary<TKey,TValue> 等泛型集合
  2. 依操作特徵選擇專用集合(Queue、Stack、HashSet、Sorted* 等)
  3. 多執行緒環境務必同步:lock、並行集合、或不可變集合
  4. 效能敏感處先測試再優化,避免過早優化
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved