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

(2)   集合:

  1. 优点:长度可变;内存易分配;可在O( 1 )内完成查找 。(一般地,集合底层结构为数组或链表)
  2. 缺点:因为底层与数组、链表相同,因此对于插入与删除较慢 。
(3)   链表:
  1. 优点:可以任意加减元素,在添加或者删除元素时只需要改变前后两个元素结点的指针域指向地址即可,所以添加、删除很快,O( 1 );
  2. 缺点:因为含有大量的指针域,占用空间较大;不支持下标与迭代器访问,因此查找元素需要遍历,非常耗时 。
二、C# 中的链表 LinkedList<T>
.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList&lt;T&gt;

文章插图
C# 中的LinkedList 为双向链表(双重链接链表),位于程序集 System.Collections.dll中的命名空间 System.Collections.Generic 之下 。
简单解释一下其拥有的特性:【注:特性基本介绍请参阅本人的文章([算法2-数组与字符串的查找与匹配] (.NET源码学习) - PaperHammer - 博客园 (cnblogs.com))】
  • Line 9:NullableContext() 表示可空的上下文 。括号中的值对应的功能如下图:

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

文章插图
这里解释一下“上下文”:
上下文并不是一个具体的东西,就和阅读小说一样,需要结合前后进行理解 。
在计组中也出现过上下文的概念,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:无参默认构造函数 。