.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList<T>( 四 )


這三個屬性在此處似乎只有定義,并沒有在其他地方調用,推測其作用是作為該對象的一種標識屬性,在進行某些操作時,供 CLR 檢測訪問是否允許執行該操作 。
【注:礙于篇幅,后兩個屬性將在之后的文章進行補充說明】
(三) 五個字段

.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList<T>

文章插圖
  • Line 701:_list 表示當前的鏈表對象,僅用于內部訪問 。
  • Line 704:_node 表示鏈表中的每個結點 。其內部包含:結點所在的鏈表、該結點的下一個結點與上一個結點、當前結點存儲的值 。
  • Line 707:_version 執行修改操作的次數 。
  • Line 710:_current 用于在枚舉器中,記錄當前所在的結點 。
  • Line 713:_index 用于在枚舉器中,記錄當前結點所對應的索引值 。
(四) 一個結構 -> 迭代器 or 枚舉器1.    結構體的構造方法
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList<T>

文章插圖
初始化內部字段,為之后的迭代器遍歷與結點做準備 。
2.    兩個屬性
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList<T>

文章插圖
  • Line 625:Current屬性,返回當前所指向的結點 。
  • Line 637:IEnumerator.Current屬性 , 迭代過訪問程中 , 若存在還未訪問到的元素,則返回當前迭代器所指向的對象 。
3.    MoveNext()方法
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList<T>

文章插圖
將指向當前結點對象的引用,向后移動到下一個結點 。配合迭代器訪問,逐一向后遍歷元素 。
  • Line 652:若兩個 version 不相同,無法執行操作 。在文章([數據結構1.2-線性表] 動態數組ArrayList(.NET源碼學習) - PaperHammer - 博客園 (cnblogs.com))中,簡要分析了 version 在ArrayList 中的作用 , 在執行某些操作后 , 會使版本號+1 。主要是一些會修改集合內部元素的操作 。因此 version 可以是做是一個集合的標識符 。
在枚舉器的構造方法里,已將 _list.version 賦值給 version,理論上每次進行枚舉迭代均會更新 version 。因此該判斷語句的目的可能是防止經過淺層拷貝的兩個集合,在職u型某些操作后,調用另一個不屬于自身的迭代器 。
【有關淺層拷貝請參閱([數據結構1.1-線性表] 數組 (.NET源碼學習) - PaperHammer - 博客園 (cnblogs.com))】
  • Line 656:若 node 為 null , 說明沒有元素可以繼續向下訪問,則返回 false 。
  • Line 661~663:index 指針向后移動;_current 記錄當前結點;訪問下一個結點 。
  • Line 664:若再次訪問到頭結點,則終止 。
4.    Reset()方法
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList<T>

文章插圖
在每次調用完枚舉器后,需要恢復原有的信息,以便下一次繼續調用 ??梢岳斫鉃榛厮?。
【注:有關迭代器的實現原理,會在文末進行補充說明】
(五) 常用方法1.    添加 AddFirst()、AddLast() 與 AddBefore()、AddAtfer()首先是方法 AddFirst() 。其有兩個重載方法,不同之處體現在返回值類型與參數 。
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList<T>

文章插圖
  • Line 156:返回類型為某一結點,參數為某一值 。
  • Line 161:若頭結點為空,說明當前鏈表內沒有結點,則調用方法InternalInsertNodeToEmptyList() 。

.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList<T>

文章插圖
該方法的作用是:在空表中創建一個結點,其既是頭結點,也是尾結點 。
  • Line 165:若頭結點不為空,說明此時表中已經存在節點,則調用方法InternalInsertNodeBefore(),將新結點加入到當前頭結點之前 , 成為新的頭結點 。

.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList<T>

文章插圖
  • Line 168、184:最終的返回結果/指向是頭結點 。
—— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— ——
方法 AddLast() 與 AddFirst() 大同小異,在此不做過多分析
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList<T>

文章插圖