.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个不同类型的隐式转换 。使用隐式转换操作符之后,在编译时会跳过异常检查,可能会出现某些异常或信息丢失 。
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;

推荐阅读