.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

推荐阅读