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


文章插圖

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

文章插圖
假如我們知道 obj 和 obj.ToString() 在這里一定不為空,那么就可以在 obj 與 ToString() 的結果后加上可空容忍運算符,將其轉換為不可空類型,以此消除警告 。
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList<T>

文章插圖
這樣操作后,obj 不可再被賦值為 null 。
六、更多的可空特性【注:
1.     特性一般用來解決警告問題,并不能解決錯誤或進行強制類型轉換 。
2.     特性的修飾更多地,只起到標識告知的作用 ?!?br /> 需要引入命名空間
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList<T>

文章插圖
(一) AllowNull性質:前置條件,即放在修飾對象前 。
作用:將不可為 null 的參數、字段或屬性使其可以為 null ?!咀⒁?,這里的“不可為”指的是警告內容,不是數據類型上的不可為空】
舉例:
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList<T>

文章插圖
現在有一個字段,當通過屬性獲取字段值的時候 , 一定不會獲得到 null,因為在 set 里面指定了非 null 的默認值 。然而在方法 Set() 里是允許設置 null 到這個屬性,但屬性 Msg 是不可為空的 。于是,為了解決警告的出現 , 要么將字段定義為可空,要么將這個加上特性 [AllowNull] 。這樣 , 獲取此字段的時候會得到非 null 值,但設置的時候卻可以傳遞 null 。
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList<T>

文章插圖

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

文章插圖
即,將不可為空的屬性 Msg 標記為可為空(可以傳入空值),但傳入空時會保持其默認值 。
大多數情況下,屬性或 in、out 和 ref 參數需要此特性 。當變量通常為非 null 時,[AllowNull] 是最佳選擇,但需要允許 null 作為前提條件 。
(二) 其余可空特性特性一般主要用于處理警告方面的問題,使得程序更加規范化,在此不作過多演示,更多內容,請參考下表(來自:C# 編譯器解釋的屬性:可為 null 的靜態分析 | Microsoft Learn)
Attribute
Category
含義
AllowNull
Precondition
不可為 null 的參數、字段或屬性可以為 null 。
DisallowNull
Precondition
可為 null 的參數、字段或屬性應永不為 null 。
MaybeNull
后置條件
不可為 null 的參數、字段、屬性或返回值可能為 null 。
NotNull
后置條件
可為 null 的參數、字段、屬性或返回值將永不為 null 。
MaybeNullWhen
有條件后置條件
當方法返回指定的 bool 值時 , 不可為 null 的參數可以為 null 。
NotNullWhen
有條件后置條件
當方法返回指定的 bool 值時 , 可以為 null 的參數不會為 null 。
NotNullIfNotNull
有條件后置條件
如果指定參數的自變量不為 null,則返回值、屬性或自變量不為 null 。
MemberNotNull
方法和屬性幫助程序方法
當方法返回時,列出的成員不會為 null 。
MemberNotNullWhen
方法和屬性幫助程序方法
當方法返回指定的 bool 值時,列出的成員不會為 null 。
DoesNotReturn
無法訪問的代碼
方法或屬性永遠不會返回 。換句話說 , 它總是引發異常 。
DoesNotReturnIf
無法訪問的代碼
如果關聯的 bool 參數具有指定值,則此方法或屬性永遠不會返回 。
七、特性 [Nullable]特性,在之前的文章中也講述過,主要是進行修飾,使得對象具有某些額外性質 。
Nullable,屬于內部密封類 NullableAttribute,派生自類 Attribute 。
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList<T>

文章插圖
  • Line 13、22:該特性有兩種表示方式,就是經??吹降模涸诶ㄌ柪飳懮蠑底只蛞粋€數組

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

文章插圖

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

文章插圖
  • Line 28:最后均存儲到名為 NullableFlags的 byte 數組中,據名稱可以推測,每個不同的數字賦予了 Nullable 這個特性不同的額外功能 。
根據 C# 的編譯器roslyn的GitHub頁面(roslyn/nullable-metadata.md at main · dotnet/roslyn · GitHub):Each type reference in metadata may have an associated NullableAttribute with a byte[] where each byte represents nullability: 0 for oblivious, 1 for not annotated, and 2 for annotated. 也就是說,該數組中的有效值僅為0、1、2,且具有不同的含義 ?!居捎跓o法找到相關文檔,也無法進行相關實驗操作,數值所代表的含義在此暫不做分析 , 后續可能會補上】

推薦閱讀