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

ReversibleSortedList 完整原始碼解析:巢狀型別與列舉器實現細節

     編輯:關於C語言

前言

ReversibleSortedList<TKey, TValue> 內部定義五個關鍵巢狀型別,分別實現列舉器、鍵集合、值集合等介面。本文完整呈現並解析這些巢狀型別的原始碼,展示框架級集合如何實現高效能、介面完整的列舉與檢視機制。

五大巢狀型別架構圖

ReversibleSortedList<TKey, TValue>
├── Enumerator<K, V>          // 主列舉器,實作 IEnumerator<KeyValuePair<K,V>>
├── KeyList<K, V>             // 鍵集合檢視,實作 IList<K> 等
│   └── ReversibleSortedListKeyEnumerator  // 鍵列舉器
├── ValueList<K, V>           // 值集合檢視,實作 IList<V> 等
│   └── ReversibleSortedListValueEnumerator // 值列舉器
└── (SortDirectionComparer)   // 已於前文解析

1. Enumerator<K, V> - 主列舉器(結構體)

核心欄位

  • _ReversibleSortedList:宿主容器參考
  • index:當前位置(0-based,Count+1 表示結束)
  • version:快照版本號,檢測列舉期間容器變更
  • key, value:當前元素緩存

關鍵方法

  • MoveNext():版本檢查 → 邊界檢查 → 讀取陣列元素 → 遞增 index → 回傳 true/false
  • Current:回傳 KeyValuePair<K, V>(key, value)
  • Reset():版本檢查 → 重置 index=0、key/value=default
  • Dispose():清空欄位協助 GC

介面顯式實現

同時實作 IEnumerator、IDictionaryEnumerator、IDisposable,Current、Key、Value、Entry 皆有顯式實現,滿足非泛型列舉需求。

2. KeyList<K, V> - 鍵集合唯讀檢視

特性

  • 實作 IList<K>、ICollection<K>、IEnumerable<K>
  • 所有修改方法(Add、Insert、Remove、Clear、this[].set)拋出 NotSupportedException
  • CopyTo 直接 Array.Copy 宿主 keys 陣列
  • IndexOf 使用 Array.BinarySearch O(log n)
  • Contains 委派 ContainsKey
  • GetEnumerator 回傳專用 ReversibleSortedListKeyEnumerator

3. ReversibleSortedListKeyEnumerator - 鍵專用列舉器

  • 輕量結構體,僅保存 currentKey、index、version
  • MoveNext 直接讀取宿主 keys[index]
  • 避免建立 KeyValuePair 物件,極致效能

4. ValueList<K, V> / ReversibleSortedListValueEnumerator - 值集合對稱實現

結構與 KeyList 完全對稱,操作 values 陣列,IndexOf 使用 Array.IndexOf 線性搜尋(值未排序)。

設計模式總結

模式應用位置效益
結構體列舉器Enumerator, KeyEnumerator, ValueEnumerator零配置、值語義、快取友善
唯讀檢視KeyList, ValueList封裝內部陣列、防止外部破壞有序性
版本號檢查所有列舉器 MoveNext/Reset快速失效,避免列舉期間修改導致未定義行為
雙介面實現泛型 + 非泛型 IEnumerator/IDictionaryEnumerator最大相容性
二分搜尋索引KeyList.IndexOf利用鍵有序特性 O(log n) 定位

重要特性說明

  • 預設容量 16:與 SortedList 一致,平衡記憶體與擴容頻率
  • 不允許重複鍵:Add 會檢查並拋出異常
  • 值可為 null:引用型別與可空值型別皆支援
  • 鍵不可為 null:Add/IndexOfKey 會檢查並拋出 ArgumentNullException
  • foreach 唯讀:列舉器回傳 KeyValuePair 結構體,屬性唯讀,防止列舉期間修改

總結

巢狀型別設計展現了 .NET 框架集合的工程化極致:

  1. 職責單一:每個型別專注單一介面契約
  2. 效能優先:結構體列舉器、二分搜尋、陣列直接複製
  3. 安全防禦:版本號檢查、唯讀檢視、null 檢查
  4. 生態相容:完整實現泛型與非泛型介面

研讀此原始碼,可深刻理解為何 SortedList/Dictionary 等核心集合能在高併發、大數據場景下穩定高效運行。

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