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


在計組中也出現過上下文的概念,CPU 在用戶態與內核態相互切換時,需要保留當前任務的上下文信息,并掛起該任務,直到優先級更高的任務結束后 , 再根據上下文信息,繼續原任務 。這里的上下文信息相當于對某個進程當前的狀態描述 。
根據這樣的方式,那么此處對于LinkedList 的該特性可以解釋為對其當前狀態描述的可空性 。

  • Line 10:Nullable() 表示存儲的元素是否可空 。其中,0表示可空可不空;1 表示不為空;2表示可為空 。
【注:有關特性 Nullable 的詳細介紹會在文末進行補充說明】
  • Line 11:DebuggerTypeProxy() 用于指定代理類型的顯示 。其會對被修飾的對象指定某個類型的代理或替身,并更改類型在調試器窗口中的顯示方式 。查看具有代理的變量時,代理將代替“顯示”中的原始類型 。調試器變量窗口僅顯示代理類型的公共成員 。不會顯示私有成員 。這里的 typeof(ICollectionDebugView<>) 就是 LinkedList 的代理類型 。
說人話就是,在調試過程中,若要查看變量內部的元素,則會顯示代理類型的相關成員 , 不會顯示原本類型的相關成員 。其主要作用是,在調試時得到最希望最關心的信息 。
【更多有關該特性的內容會在今后專門發文詳解】
  • Line 12:DebuggerDisplay() 可以幫助我們直接在局部變量窗格或者鼠標劃過的時候就看到對象中我們最希望了解的信息 。
  • Line 13:TypeForwardedFrom() 獲取被修飾對象的來源 。
  • Line 14:Serializable 可序列化標志 。
解釋一下“序列化”:
有時為了使用介質轉移對象,并且把對象的狀態保持下來,就需要把對象所有信息保存下來,這個過程就叫做序列化 。通俗點 , 就是把人的魂(對象)收伏成一個石子(可傳輸的介質) 。各種序列化類各自有各自的做法 , 這些序列化類只是讀取這個標簽 , 之后就按照自己的方式去序列化 。
【注:下一篇會對序列化與反序列化進行補充說明】
(一) 三個構造方法
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList&lt;T&gt;

文章插圖
  • Line 18:無參默認構造函數 。
  • Line 23:以非空集合進行初始化的構造函數,利用范型臨時變量迭代器,自動以集合中的元素生成鏈表 。

.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList&lt;T&gt;

文章插圖

.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList&lt;T&gt;

文章插圖
注意,由于 ArrayList 內部存儲的元素并不是同一個類型,因此其并未繼承泛型接口 IEnumerable<T>,其只繼承了普通接口 IEnumerable,因此不能將其通過構造函數直接轉化為鏈表 。
  • Line 36:傳入了一個對象進行序列化或反序列化所需的全部數據,將這些數據賦值給字段 _siInfo 。contest 表示該對象的數據流的信息,作用是說明給定序列化流的源和目標,并提供另一個調用方定義的上下文 。
(二) 六個屬性1.    Count
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList&lt;T&gt;

文章插圖
只讀屬性 , 返回鏈表長度 。
2.    First
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList&lt;T&gt;

文章插圖
只讀屬性,返回鏈表頭結點,若不存在則根據特性 Nullable 返回空 。每個數字對應修飾的對象,此處 2表示可為空 , 對應 Linkedlist;1表示不能為空,對應 <T> 。
一般地,被 Nullable 修飾的變量可以為空 。以 Nullable 作為特性,可以修飾方法、屬性等,拓寬了數據可為空的范圍 。
3.    Last
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList&lt;T&gt;

文章插圖
只讀屬性,返回鏈表尾結點 。因為LinkedList 默認是雙向鏈表,因此 tail == head.prev 。
4.    IsReadOnly、IsSynchronized與SyncRoot注:這三個屬性為非公共屬性,只限于類自己內部調用 。
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList&lt;T&gt;

文章插圖

.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList&lt;T&gt;

文章插圖
只讀屬性,分別表示 LinkedList 的非只讀、對堆棧的訪問不同步 (線程安全)、獲取可用于同步對 ICollection 的訪問的對象 。其中,符號<!0>可能表示非 NULL

推薦閱讀