.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>( 六 )


(六) 结点类 LinkedListNode<T>

.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList&lt;T&gt;

文章插图
包含四个字段:list 结点所在的链表;next 结点的下一个节点;prev 结点的上一个结点;item 结点内部存储的元素 。
.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList&lt;T&gt;

文章插图
两种初始化的方式,没有默认构造器 。也就是说,在定义节点时必须对其赋值(默认为 null) 。但链表 LinkedList 是有默认构造器的 。
对结点包括以下三种查询操作(Next、Previous、Value):
.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList&lt;T&gt;

文章插图

.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList&lt;T&gt;

文章插图
三、C# 与 Java 中的链表结构单个数据结构其实没有太多要讲的内容,既然 C# 与 Java 是两大较为著名的 OO 语言,那在此就对比一下二者在实现链表结构时的异同 。
(一) 结点类 Node<E>
.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList&lt;T&gt;

文章插图
可以知道,Java 中的链表结构也是双向链表 。
(二) 构造方法
.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList&lt;T&gt;

文章插图
Java 中的 LinkedList 有两个构造方法 。不过差别不大,只不过 C# 中的 LinekdList<T> 还多了一个可列化的元素集 。
(三) 属性
.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList&lt;T&gt;

文章插图
注:在 Java 中此类变量称作属性,没有字段的概念;在 C# 中此类变量称作字段,而属性是针对字段而设计的访问器,用于增强安全性 。
除去 C# LinkedList 中的三个特殊字段,其余与 Java LinkedList 一致 。
(四) 方法:添加 add()、addFirst() 与 addLast() 方法
.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList&lt;T&gt;

文章插图

.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList&lt;T&gt;

文章插图
可以看到,C# 中的添加方法内置方法 InternalInsert…();Java 中也和 C# 类似,均调用其他来实现 。鉴于相似性 , 下面就只展示一下方法 linkLast() 不做分析 。
.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList&lt;T&gt;

文章插图
总结区别不大 。硬要说,就可能是运行时 CLR(公共语言运行库) 于 JVM(Java 虚拟机) 优化性能的差异了 。
[# 有关可空类型、Nullable<T>与特性 [Nullable] ]一、可空类型众所周知,在C# 中,值类型时不可空的,引用类型是可空的:
.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList&lt;T&gt;

文章插图
过了一段时间,大概在 C# 5 时期,引入了可空值类型,长这样:
.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList&lt;T&gt;

文章插图
然后又又又过了一段时间,应该是在 C# 8 引入了,可空引用类型:
.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList&lt;T&gt;

文章插图
—— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— ——
调用一下反汇编 , 看看加了一个问号会不会对数据类型产生影响
.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList&lt;T&gt;

文章插图

.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList&lt;T&gt;

文章插图
string? 依然是 string,int? 不再是 int , 而是变成了 Nullable 类型,相当于:
.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList&lt;T&gt;

文章插图
二、为什么要引入可空引用类型?分析一下这个有意思的 CS8600 警告:
严重性
代码
说明
警告
CS8600
将 null 文本或可能的 null 值转换为不可为 null 类型 。
嘿!我大引用类型什么时候变成不可为 null 类型了?根据微软文档的解释:该警告的目的是将应用程序在运行时引发 System.NullReferenceException 的可能性降至最低 。简单说就是降低代码在运行时引发空引用异常的概率,这一做法会让程序在运行时带来一些效率上的提高 。至于是怎么提高的,应该是避免了异常的频繁发生 , 导致程序频繁终止 。(个人观点,仅供参考) 。
三、Nullable<T> 的实现[注意:Nullable<T> 和 Nullable 是两个不同的概念,前一个是结构体,后一个是类;当然二者都是数据类型]

推荐阅读