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


(一) 一個構造方法

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

文章插圖
  • Line 14:特性 [NonVersionable]

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

文章插圖
上述文本摘自 Reference Source .NET Framework 4.8 。直譯:這個特性用于表示特定成員的實現或結構布局不能以不兼容的方式在給定的平臺進行更改 。這允許跨模塊內聯方法和數據結構,這些方法和結構的實現在ReadyToRun的本機映像中永遠不會改變,對這些成員或類型的任何更改都將破壞對ReadyToRun的更改 。說人話大概就是,不允許在某些平臺上亂改被其修飾的對象,以此保證在本機映像和實際使用時的一致性,避免在不同的環境下同一個內容出現不同的形式 。
  • Line 18:表示當前對象是否存儲了元素 。
(二) 兩個只讀屬性
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList<T>

文章插圖
判斷是否存儲了元素以及返回存儲的元素 。
(三) 兩個字段
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList<T>

文章插圖
hasValue 用于表示當前對象是否存儲了某個值;value 表示存儲的值 。
(四) 兩個重載運算符
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList<T>

文章插圖
implicit 用于聲明隱式的自定義類型轉換運算符,實現2個不同類型的隱式轉換 。使用隱式轉換操作符之后,在編譯時會跳過異常檢查,可能會出現某些異?;蛐畔G失 。
explicit 用于聲明必須通過顯示轉換來調用的自定義的類型轉換運算符 。不同于隱式轉換,顯式轉換運算符必須通過轉換的方式來調用 , 如果缺少了顯式轉換,在編譯時會產生錯誤 。
簡單來說,這兩個關鍵字用于聲明類型轉換的運算符,針對自定義類型間的轉換,一種為隱式轉換 , 另一種為顯示轉換 。
  • Line 98:將 value 從類型 T 隱式轉換為 T?
  • Line 105:將 value 從類型 T? 顯示轉換為 T
(五)  常用方法
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList<T>

文章插圖
其包含的方法和其他類型中的方法大致相同,在此不作解釋 。
四、(空)合并運算符 ??單個問號在 C# 中是三元表達式的結構之一,也是定于可空類型的符號 。而兩個問號被定義為合并運算符,其工作原理如下:對于表達式 <par> = <par1> ?? <par2> 如果左操作數 par1 的值不為 null,則合并運算符返回該值 , 即 par1;否則,它會計算右操作數并返回其結果 。如果左操作數的計算結果為不為 null,則  ??  運算符不會計算其右操作數 。
僅當左操作數的計算結果為 null 時 , Null 合并賦值運算符 ??= 才會將其右操作數的值賦值給其左操作數 。如果左操作數的計算結果為非 null,則 ??= 運算符不會計算其右操作數 。其中 ??= 運算符的左操作數必須是變量、屬性或索引器元素 。
舉例如下:
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList&lt;T&gt;

文章插圖
【.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList<T>】此時 a 為 null,因此返回 5
—— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— ——
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList&lt;T&gt;

文章插圖
此時 a 不為 null , 因此返回 a 的值 。
—— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— ——
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList&lt;T&gt;

文章插圖

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

文章插圖
同理可得,a 為空返回11;a 不為空返回 a 。
五、可空容忍 !
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList&lt;T&gt;

文章插圖
其實這是一個補充 , 在代碼中如果我們判斷出某個變量在使用時一定不為null,但是編譯器會在可空上下文中拋出警告,這是一個不太正常的行為 , 可空容忍可以消除這種警告 , 將不可為空的引用類型轉換成可為空的引用類型 。
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList&lt;T&gt;

推薦閱讀